sql >> Databáze >  >> RDS >> Sqlserver

Najít odkazující entity na SQL Server:sys.dm_sql_referencing_entities()

V SQL Server můžete použít sys.dm_sql_referencing_entities() funkce systémové dynamické správy k získání seznamu všech entit v aktuální databázi, které podle názvu odkazují na jinou uživatelem definovanou entitu.

Jinými slovy, vrací seznam entit, které závisí na dané entitě.

Konkrétně uvádí následující typy entit v aktuální databázi, které odkazují na zadanou entitu:

  • Entity vázané nebo nevázané na schéma
  • Spouštěče DDL na úrovni databáze
  • Spouštěče DDL na úrovni serveru

Syntaxe

Syntaxe vypadá takto:

sys.dm_sql_referencing_entities (  
    ' schema_name.referenced_entity_name ' , '  ' )  
  
 ::=  
{  
    OBJECT  
  | TYPE  
  | XML_SCHEMA_COLLECTION  
  | PARTITION_FUNCTION  
}

Příklad 1 – Základní příklad

Zde je základní příklad použití:

USE WideWorldImporters;
SELECT *
FROM sys.dm_sql_referencing_entities (
    'Application.Cities', 
    'OBJECT');

Výsledek:

+---------------------------+---------------------------+------------------+---------------------+--------------------------+-----------------------+
| 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                     |
+---------------------------+---------------------------+------------------+---------------------+--------------------------+-----------------------+

V tomto příkladu existuje šest entit, které odkazují na ‘Application.Cities’ v databázi ‘WideWorldImporters’.

Společnost Microsoft výslovně nedoporučuje používat hvězdičku (* ), chcete-li vybrat všechny sloupce ze zobrazení a funkcí dynamické správy (z toho sys.dm_sql_referencing_entities() je jeden). Důvodem je, že jejich schémata a data, která vracejí, se mohou v budoucích verzích SQL Serveru změnit. To by mohlo mít za následek přidání sloupců na konec seznamu sloupců v budoucích verzích, což by mohlo zkomplikovat vaši aplikaci, pokud se při výběru všech sloupců spoléháte na hvězdičku.

Proto by měl být předchozí kód přepsán na tento:

Příklad:

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');

Samozřejmě můžete vždy zadat méně sloupců, pokud chcete.

Příklad 2 – Získání typu odkazující entity

Výše uvedený příklad je v pořádku, ale neříká nám typ odkazující entity. Jinými slovy, nemůžeme vidět, zda se jedná o pohled, uloženou proceduru atd.

Tyto informace můžete získat připojením k sys.dm_sql_referencing_entities() s sys.objects .

Předchozí příklad bychom tedy mohli upravit takto:

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;  

Výsledek:

+----------------------------------+-------------+-------------------------+
| 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               |
+----------------------------------+-------------+-------------------------+

Příklad 3 – Uživatelsky definované typy

Zde je příklad použití sys.dm_sql_referencing_entities() vrátit entity, které odkazují na daný uživatelsky definovaný typ aliasu.

Pro tento příklad jsem vytvořil uživatelem definovaný alias nazvaný clientcode . Poté jsem jej použil ve dvou sloupcích (ve dvou různých tabulkách) a také jsem vytvořil uloženou proceduru, která odkazuje na typ podle názvu (přijímá argument nazvaný @ClientCode což je z clientcode typ).

Chcete-li vrátit uživatelem definovaný typ, použijte TYPE jako druhý argument.

Příklad:

USE Test;
SELECT 
  referencing_entity_name
FROM sys.dm_sql_referencing_entities (
    'dbo.clientcode', 
    'TYPE');

Výsledek:

+---------------------------+
| referencing_entity_name   |
|---------------------------|
| uspGetClient              |
| uspGetOrdersByClient      |
+---------------------------+

Podle názvů poznám, že obě jsou uložené procedury (obě mají předponu usp , což je běžná konvence při vytváření uživatelsky definovaných uložených procedur), ale můžeme to potvrdit kontrolou sys.objects zobrazení systémového katalogu ještě jednou:

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;  

Výsledek:

+----------------------+----------+----------------------+
| Type                 | Schema   | Name                 |
|----------------------+----------+----------------------|
| SQL_STORED_PROCEDURE | dbo      | uspGetClient         |
| SQL_STORED_PROCEDURE | dbo      | uspGetOrdersByClient |
+----------------------+----------+----------------------+

Všimněte si, že tento typ aliasu se používá ve sloupcích dvou tabulek v této databázi. Tyto závislosti se však nezobrazují v našem seznamu závislostí, protože uživatelsky definovaný typ není v definici vypočítaného sloupce, CHECK omezení nebo DEFAULT omezení v tabulce.

Jedna z tabulek také odkazuje na druhou tabulku prostřednictvím omezení cizího klíče ve sloupci, který používá dbo.clientcode uživatelsky definovaný typ, ale tento se také neobjevuje v našem seznamu.

Oficiální dokumentace

Podrobnější informace naleznete v části sys.dm_sql_referencing_entities na webu společnosti Microsoft.


  1. Vkládání MySQL z jedné databáze do druhé

  2. Jak nainstalovat SQL Server na Mac

  3. Jak převést pole json na řádky v postgresu

  4. Odstranění úvodních nul z vývojáře varchar sql