מי פונה לעמודות בטבלה?

30/05/2017

אין תגובות

אפשר בקלות יחסית לכתוב סקריפט שמוצא אילו אובייקטים (פרוצדורות, views וכו’) פונים לטבלה מסויימת בעזרת טבלת המערכת sys.sql_dependencies או קליק ימני ו-Dependencies על הטבלה בממשק הגרפי ב-SSMS; אך יותר מאתגר למצוא מי פונה לעמודות מסויימות בטבלה: הריי לא נרצה לקבל שמות של כמה עשרות אובייקטים שרובם פונים לעמודות אחרות שאינן מעניינות אותנו..
השליפה (תואמת SQL 2016 ו-Azure):

Declare    @Obj Varchar(256)='dbo.MyTbl',

        @Col Varchar(Max)='Col1,Col2,Col3';

With T As

(Select    Concat(Object_Schema_Name(D.object_id,DB_ID()),'.',Object_Name(D.object_id,DB_ID())) ObjectName,

        Concat(Object_Schema_Name(D.referenced_major_id,DB_ID()),'.',Object_Name(D.referenced_major_id,DB_ID())) ReferencedObjectName,

        D.is_selected,

        D.is_updated,

        D.is_select_all,

        O.type_desc,

        C2.name

From    sys.sql_dependencies D

Outer Apply (Select    name

            From    sys.columns C

            Where    C.object_id=D.referenced_major_id

                    And C.column_id=D.referenced_minor_id) C2

Outer Apply (Select    type_desc

            From    sys.objects O

            Where    O.object_id=D.object_id) O

Where    D.referenced_major_id=object_id(@Obj)

        And Concat(',',@Col,',') Like Concat('%,',C2.name,',%'))

Select    ObjectName,

        type_desc,

        is_selected,

        is_updated,

        is_select_all,

        String_Agg(name,',') Columns

From    T

Group By ObjectName,

        type_desc,

        is_selected,

        is_updated,

        is_select_all;

מי שטרם התחדש בגרסת 2016 דנדשה מהניילון יכול להסתפק במה שבתוך ה-CTE: זה עלול ליצור כפילויות כשעמודות שונות יופיעו באותו אובייקט, אך בעזרת מיון נכון ניתן להימנע מעבודה כפולה.

בשני הפרמטרים בהתחלה יש לציין את שם הטבלה (כולל סכימה) ושמות העמודות משורשרות בפסיקים.

is_selected – העמודה נכללת בפקודת Select במפורש, או בתנאי On ו-Where או ב-Order By וכו’ (מצויינת במפורש אך לא מעודכנת)
is_select_all – העמודה נכללת במרומז בפקודת * Select.
is_uddated – העמודה מתעדכנת בפקודת Insert או Update.

זה הכל? כל המידע בכף ידנו?
בואו ננמיך ציפיות- להלן רשימה של מה שלא יופיע ושנצטרך לאתרו בדרכים אחרות:

  • קוד בתוך אפליקציות חיצוניות לדטבייס (כלי אוטומציה, dot net, דוחות SSRS..).
  • קוד בדטבייסים אחרים.
  • קוד דינאמי בדטבייס (שמבוצע בעזרת sp_executesql וכו’).
  • קוד בתוך ג’ובים.
  • קוד שמופעל משרתים אחרים (למשל דרך Linked Server).
  • קוד שעובדים מריצים באופן עצמאי (מתחברים ל-SSMS ומריצים סקריפט..)
הוסף תגובה
facebook linkedin twitter email

כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *