การค้นหาการพึ่งพาบนคอลัมน์เฉพาะ (วิธีที่ทันสมัยโดยไม่ต้องใช้ sysdepends)


14

ฉันต้องการค้นหาขั้นตอนการดูและการจัดเก็บทั้งหมดที่ใช้ไม่ใช่เฉพาะตารางบางตัวเท่านั้น แต่ยังมีคอลัมน์เฉพาะในตารางด้วย

"ดูเหมือนว่า" ต่อไปนี้ใช้งานได้ แต่มีคำเตือนมากมายที่ต้องระวังด้วยวิธีนี้ (ไม่น่าเชื่อถือด้วยเหตุผลหลายประการที่จะเลิกเร็ว ๆ นี้ ฯลฯ ):

SELECT object_name(so.id) TableName, sc.name ColumnName, OBJECT_NAME(sd.id) DependentObjectName,
(SELECT xtype FROM sysobjects so WHERE so.id = sd.id) Object_Type
FROM sysobjects so INNER JOIN syscolumns sc
ON so.id = sc.id
INNER JOIN sysdepends sd
ON so.id = sd.depid and sc.colid = sd.depnumber
WHERE 
    object_name(so.id) = 'MyTableName'
AND sc.name = 'MyColumnName'
order by object_name(so.id), Object_Type

วิธีการทางเลือกบางอย่างที่มักถูกอ้างถึงคือ sys.sql_dependencies และ sys.sql_expression_dependencies แต่สิ่งเหล่านี้ไม่ได้มีความละเอียดระดับคอลัมน์

ไม่มีใครรู้วิธีการทำเช่นนี้? (หรือแม้ว่าคุณรู้แน่ชัดว่ามันไม่สามารถทำได้อย่างแท้จริงมันจะเป็นประโยชน์ที่จะรู้)


1
ตัวอย่างที่ 2 ของเคล็ดลับนี้ใช้สำหรับการค้นหาในระดับคอลัมน์

คำตอบ:


13

นี่คือตัวอย่างของ AdventureWorks ในการดูการขึ้นต่อกันของคอลัมน์

SELECT ReferencingObject = SCHEMA_NAME(o1.schema_id) + '.' + o1.name,
       ReferencedObject = SCHEMA_NAME(o2.schema_id) + '.'
                          + ed.referenced_entity_name,
       ColumnName = c.name,
       ReferencedObjectType = o2.type,
       ReferencingObjecType = o1.type
FROM   AdventureWorks2012.sys.sql_expression_dependencies ed
       INNER JOIN AdventureWorks2012.sys.objects o1
               ON ed.referencing_id = o1.object_id
       INNER JOIN AdventureWorks2012.sys.objects o2
               ON ed.referenced_id = o2.object_id
       INNER JOIN AdventureWorks2012.sys.sql_dependencies d
               ON ed.referencing_id = d.object_id
                  AND d.referenced_major_id = ed.referenced_id
       INNER JOIN sys.columns c
               ON c.object_id = ed.referenced_id
                  AND d.referenced_minor_id = c.column_id
WHERE  SCHEMA_NAME(o1.schema_id) + '.' + o1.name = 'HumanResources.vEmployee' AND c.name = 'JobTitle'
ORDER  BY ReferencedObject,
          c.column_id; 

มันดูดีมาก คุณสามารถแสดงความคิดเห็นได้ว่าปัญหาทั้งหมดนี้หรือทั้งหมดเกิดขึ้นจากปัญหา "เก่าล้าสมัย" ในลักษณะเดียวกันหรือไม่ ดู: sqlblog.com/blogs/aaron_bertrand/archive/2008/09/09/…
tbone

นอกจากนี้: ความคิดใด ๆ ถ้ามันจะแก้ปัญหาการพึ่งพาซ้อนกัน? เช่น: แยงขึ้นอยู่กับมุมมองซึ่งขึ้นอยู่กับ Table.COLUMN: ถ้าเรากำหนดเกณฑ์ใน Table & COLUMN ทั้งมุมมองและ proc จะแสดงในผลลัพธ์หรือไม่
tbone

ฉันไม่เข้าใจว่าจุดประสงค์อะไรที่จะได้รับตามwhereเงื่อนไข TS ต้องการค้นหาการพึ่งพาในคอลัมน์ที่ระบุ ฉันคิดว่าเงื่อนไขควรมีการ จำกัดc.nameและed.referenced_id/ ed.referenced_entity_nameหรือไม่
pkuderov

ที่นี่ใน 2019 - ขณะนี้อยู่ในโหมดการบำรุงรักษาและทีมงานไมโครซอฟท์แนะนำให้ใช้เพียงsys.sql_dependencies sys.sql_expression_dependenciesที่ถูกกล่าว - ดูเหมือนจะไม่sys.sql_expression_dependenciesจับรายละเอียดในระดับเดียวกัน
10762409 พูดว่า Reinstate Monica
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.