SQL सर्वर में, आप sys.dm_sql_referencing_entities()
का उपयोग कर सकते हैं वर्तमान डेटाबेस में सभी संस्थाओं की सूची प्राप्त करने के लिए सिस्टम गतिशील प्रबंधन फ़ंक्शन जो किसी अन्य उपयोगकर्ता-परिभाषित इकाई को नाम से संदर्भित करता है।
दूसरे शब्दों में, यह उन संस्थाओं की सूची देता है जो दी गई इकाई पर निर्भर करती हैं।
विशेष रूप से, यह वर्तमान डेटाबेस में निम्नलिखित इकाई प्रकारों पर रिपोर्ट करता है जो निर्दिष्ट इकाई का संदर्भ देते हैं:
- स्कीमा-बाध्य या गैर-स्कीमा-बाध्य इकाइयां
- डेटाबेस-स्तरीय DDL ट्रिगर
- सर्वर-स्तरीय DDL ट्रिगर
सिंटैक्स
वाक्य रचना इस प्रकार है:
sys.dm_sql_referencing_entities ( ' schema_name.referenced_entity_name ' , '' ) ::= { OBJECT | TYPE | XML_SCHEMA_COLLECTION | PARTITION_FUNCTION }
उदाहरण 1 - मूल उदाहरण
यहां उपयोग का एक बुनियादी उदाहरण दिया गया है:
USE WideWorldImporters; SELECT * FROM sys.dm_sql_referencing_entities ( 'Application.Cities', 'OBJECT');
परिणाम:
+---------------------------+---------------------------+------------------+---------------------+--------------------------+-----------------------+ | referencing_schema_name | referencing_entity_name | referencing_id | referencing_class | referencing_class_desc | is_caller_dependent | |---------------------------+---------------------------+------------------+---------------------+--------------------------+-----------------------| | Application | DetermineCustomerAccess | 1051150790 | 1 | OBJECT_OR_COLUMN | 0 | | Integration | GetCityUpdates | 1758629308 | 1 | OBJECT_OR_COLUMN | 0 | | Website | Customers | 1694629080 | 1 | OBJECT_OR_COLUMN | 0 | | Website | SearchForCustomers | 942626401 | 1 | OBJECT_OR_COLUMN | 0 | | Website | SearchForSuppliers | 926626344 | 1 | OBJECT_OR_COLUMN | 0 | | Website | Suppliers | 1678629023 | 1 | OBJECT_OR_COLUMN | 0 | +---------------------------+---------------------------+------------------+---------------------+--------------------------+-----------------------+
इस उदाहरण में, छह इकाइयां हैं जो 'वाइडवर्ल्ड इम्पोर्टर्स' डेटाबेस में 'एप्लिकेशन.सिटीज' का संदर्भ देती हैं।
Microsoft विशेष रूप से तारांकन (*
.) के उपयोग के विरुद्ध अनुशंसा करता है ) गतिशील प्रबंधन दृश्यों और कार्यों से सभी स्तंभों का चयन करने के लिए (जिनमें से sys.dm_sql_referencing_entities()
एक है)। ऐसा इसलिए है क्योंकि उनके स्कीमा और उनके द्वारा लौटाया गया डेटा SQL सर्वर के भविष्य के रिलीज़ में बदल सकता है। इसके परिणामस्वरूप भविष्य में रिलीज में कॉलम सूची के अंत में कॉलम जोड़े जा सकते हैं, जो आपके आवेदन को गड़बड़ कर सकता है यदि आप सभी कॉलम चुनने के लिए तारांकन पर भरोसा कर रहे हैं।
इसलिए, पिछला कोड इस पर फिर से लिखा जाना चाहिए:
उदाहरण:
USE WideWorldImporters; SELECT referencing_schema_name, referencing_entity_name, referencing_id, referencing_class, referencing_class_desc, is_caller_dependent FROM sys.dm_sql_referencing_entities ( 'Application.Cities', 'OBJECT');
बेशक, यदि आप चाहें तो हमेशा कम कॉलम निर्दिष्ट कर सकते हैं।
उदाहरण 2 - संदर्भ इकाई प्रकार प्राप्त करें
उपरोक्त उदाहरण सभी अच्छे और अच्छे हैं, लेकिन यह हमें संदर्भित इकाई के प्रकार के बारे में नहीं बताता है। दूसरे शब्दों में, हम यह नहीं देख सकते हैं कि यह एक दृश्य है, एक संग्रहीत प्रक्रिया, आदि।
आप sys.dm_sql_referencing_entities()
से जुड़कर यह जानकारी प्राप्त कर सकते हैं sys.objects
. के साथ .
इसलिए हम पिछले उदाहरण को इस तरह संशोधित कर सकते हैं:
SELECT o.type_desc 'Type', re.referencing_schema_name 'Schema', re.referencing_entity_name 'Name' FROM sys.dm_sql_referencing_entities ( 'Application.Cities', 'OBJECT') re INNER JOIN sys.objects o ON re.referencing_id = o.object_id ORDER BY 'Type' ASC;
परिणाम:
+----------------------------------+-------------+-------------------------+ | Type | Schema | Name | |----------------------------------+-------------+-------------------------| | SQL_INLINE_TABLE_VALUED_FUNCTION | Application | DetermineCustomerAccess | | SQL_STORED_PROCEDURE | Integration | GetCityUpdates | | SQL_STORED_PROCEDURE | Website | SearchForCustomers | | SQL_STORED_PROCEDURE | Website | SearchForSuppliers | | VIEW | Website | Suppliers | | VIEW | Website | Customers | +----------------------------------+-------------+-------------------------+
उदाहरण 3 - उपयोगकर्ता-निर्धारित प्रकार
यहां sys.dm_sql_referencing_entities()
का उपयोग करने का एक उदाहरण दिया गया है किसी दिए गए उपयोगकर्ता-परिभाषित उपनाम प्रकार को संदर्भित करने वाली संस्थाओं को वापस करने के लिए।
इस उदाहरण के लिए, मैंने clientcode
. नामक उपयोगकर्ता-परिभाषित उपनाम बनाया है . इसके बाद मैंने इसे दो कॉलम (दो अलग-अलग तालिकाओं में) में इस्तेमाल किया, और मैंने एक संग्रहीत प्रक्रिया भी बनाई जो नाम से प्रकार का संदर्भ देती है (यह @ClientCode
नामक तर्क को स्वीकार करती है। जो clientcode
. का है टाइप करें)।
उपयोगकर्ता द्वारा परिभाषित प्रकार वापस करने के लिए, TYPE
. का उपयोग करें दूसरे तर्क के रूप में।
उदाहरण:
USE Test; SELECT referencing_entity_name FROM sys.dm_sql_referencing_entities ( 'dbo.clientcode', 'TYPE');
परिणाम:
+---------------------------+ | referencing_entity_name | |---------------------------| | uspGetClient | | uspGetOrdersByClient | +---------------------------+
मैं नामों से बता सकता हूं कि ये दोनों संग्रहित प्रक्रियाएं हैं (वे दोनों usp
के साथ उपसर्ग करते हैं , जो उपयोगकर्ता द्वारा परिभाषित संग्रहीत कार्यविधियाँ बनाते समय एक सामान्य परंपरा है), लेकिन हम sys.objects
की जाँच करके इसकी पुष्टि कर सकते हैं। सिस्टम कैटलॉग एक बार फिर से देखें:
SELECT o.type_desc 'Type', re.referencing_schema_name 'Schema', re.referencing_entity_name 'Name' FROM sys.dm_sql_referencing_entities ( 'dbo.clientcode', 'TYPE') re INNER JOIN sys.objects o ON re.referencing_id = o.object_id ORDER BY 'Type' ASC;
परिणाम:
+----------------------+----------+----------------------+ | Type | Schema | Name | |----------------------+----------+----------------------| | SQL_STORED_PROCEDURE | dbo | uspGetClient | | SQL_STORED_PROCEDURE | dbo | uspGetOrdersByClient | +----------------------+----------+----------------------+
ध्यान दें कि इस उपनाम प्रकार का उपयोग इस डेटाबेस में दो तालिकाओं के कॉलम में किया जाता है। हालांकि, ये निर्भरता की हमारी सूची में दिखाई नहीं देते हैं क्योंकि उपयोगकर्ता द्वारा परिभाषित प्रकार गणना किए गए कॉलम की परिभाषा में नहीं है, CHECK
बाधा, या DEFAULT
तालिका में बाधा।
साथ ही, एक तालिका dbo.clientcode
का उपयोग करने वाले स्तंभ पर एक विदेशी कुंजी बाधा के माध्यम से दूसरी तालिका का संदर्भ देती है उपयोगकर्ता-परिभाषित प्रकार, लेकिन यह भी हमारी सूची में दिखाई नहीं देता है।
आधिकारिक दस्तावेज़ीकरण
अधिक विस्तृत जानकारी के लिए, देखें sys.dm_sql_referencing_entities
माइक्रोसॉफ्ट वेबसाइट पर।