Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

SQL सर्वर में संदर्भ निकाय खोजें:sys.dm_sql_referencing_entities ()

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 माइक्रोसॉफ्ट वेबसाइट पर।


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ASP.NET में C# का उपयोग करके डेटाबेस से बाइनरी इमेज कैसे प्राप्त करें?

  2. इन-मेमोरी OLTP:SQL सर्वर 2016 में नया क्या है

  3. SQL सर्वर (T-SQL) में डेटाबेस मेल प्रोफाइल की सूची लौटाएं

  4. मैं स्क्रिप्ट के भीतर से SQL सर्वर स्क्रिप्ट का टाइमआउट कैसे सेट करूं?

  5. उपलब्धता समूहों पर हमेशा SQL सर्वर की निगरानी करने के विभिन्न तरीके