W SQL Server możesz użyć sys.dm_sql_referencing_entities()
funkcja dynamicznego zarządzania systemem, aby uzyskać listę wszystkich jednostek w bieżącej bazie danych, które odwołują się do innej jednostki zdefiniowanej przez użytkownika według nazwy.
Innymi słowy, zwraca listę podmiotów zależnych od danego podmiotu.
W szczególności raportuje następujące typy jednostek w bieżącej bazie danych, które odwołują się do określonej jednostki:
- Edycje powiązane ze schematem lub niepowiązane ze schematem
- Wyzwalacze DDL na poziomie bazy danych
- Wyzwalacze DDL na poziomie serwera
Składnia
Składnia wygląda tak:
sys.dm_sql_referencing_entities ( ' schema_name.referenced_entity_name ' , '' ) ::= { OBJECT | TYPE | XML_SCHEMA_COLLECTION | PARTITION_FUNCTION }
Przykład 1 – Przykład podstawowy
Oto podstawowy przykład użycia:
USE WideWorldImporters; SELECT * FROM sys.dm_sql_referencing_entities ( 'Application.Cities', 'OBJECT');
Wynik:
+---------------------------+---------------------------+------------------+---------------------+--------------------------+-----------------------+ | 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 | +---------------------------+---------------------------+------------------+---------------------+--------------------------+-----------------------+
W tym przykładzie istnieje sześć podmiotów, które odwołują się do „Application.Cities” w bazie danych „WideWorldImporters”.
Microsoft wyraźnie odradza używanie gwiazdki (*
), aby wybrać wszystkie kolumny z dynamicznych widoków zarządzania i funkcji (z których sys.dm_sql_referencing_entities()
jest jeden). Dzieje się tak, ponieważ ich schematy i zwracane dane mogą ulec zmianie w przyszłych wydaniach SQL Server. Może to spowodować dodanie kolumn na końcu listy kolumn w przyszłych wydaniach, co może zepsuć Twoją aplikację, jeśli polegasz na gwiazdki, aby wybrać wszystkie kolumny.
Dlatego poprzedni kod powinien zostać przepisany w ten sposób:
Przykład:
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');
Oczywiście, jeśli chcesz, zawsze możesz określić mniej kolumn.
Przykład 2 – Uzyskaj typ jednostki referencyjnej
Powyższy przykład jest dobry i dobry, ale nie mówi nam o typie encji odniesienia. Innymi słowy, nie możemy zobaczyć, czy jest to widok, procedura składowana itp.
Możesz uzyskać te informacje, dołączając do sys.dm_sql_referencing_entities()
z sys.objects
.
Możemy więc zmodyfikować poprzedni przykład w ten sposób:
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;
Wynik:
+----------------------------------+-------------+-------------------------+ | 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 | +----------------------------------+-------------+-------------------------+
Przykład 3 – Typy zdefiniowane przez użytkownika
Oto przykład użycia sys.dm_sql_referencing_entities()
aby zwrócić encje, które odwołują się do danego typu aliasu zdefiniowanego przez użytkownika.
W tym przykładzie utworzyłem zdefiniowany przez użytkownika alias o nazwie clientcode
. Następnie użyłem go w dwóch kolumnach (w dwóch różnych tabelach), a także stworzyłem procedurę składowaną, która odwołuje się do typu według nazwy (akceptuje argument o nazwie @ClientCode
który jest z clientcode
typ).
Aby zwrócić typ zdefiniowany przez użytkownika, użyj TYPE
jako drugi argument.
Przykład:
USE Test; SELECT referencing_entity_name FROM sys.dm_sql_referencing_entities ( 'dbo.clientcode', 'TYPE');
Wynik:
+---------------------------+ | referencing_entity_name | |---------------------------| | uspGetClient | | uspGetOrdersByClient | +---------------------------+
Po nazwach mogę stwierdzić, że obie są procedurami składowanymi (obie mają przedrostek usp
, co jest powszechną konwencją podczas tworzenia procedur składowanych zdefiniowanych przez użytkownika), ale możemy to potwierdzić, sprawdzając sys.objects
widok katalogu systemowego jeszcze raz:
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;
Wynik:
+----------------------+----------+----------------------+ | Type | Schema | Name | |----------------------+----------+----------------------| | SQL_STORED_PROCEDURE | dbo | uspGetClient | | SQL_STORED_PROCEDURE | dbo | uspGetOrdersByClient | +----------------------+----------+----------------------+
Zauważ, że ten typ aliasu jest używany w kolumnach dwóch tabel w tej bazie danych. Jednak nie pojawiają się one na naszej liście zależności, ponieważ typ zdefiniowany przez użytkownika nie znajduje się w definicji kolumny wyliczanej, CHECK
ograniczenie lub DEFAULT
ograniczenie w tabeli.
Ponadto jedna z tabel odwołuje się do drugiej tabeli poprzez ograniczenie klucza obcego w kolumnie, która używa dbo.clientcode
typ zdefiniowany przez użytkownika, ale ten również nie pojawia się na naszej liście.
Oficjalna dokumentacja
Aby uzyskać bardziej szczegółowe informacje, zobacz sys.dm_sql_referencing_entities
na stronie Microsoft.