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.