W SQL Server możesz użyć sys.dm_sql_referenced_entities()
funkcja dynamicznego zarządzania systemem, aby uzyskać listę wszystkich jednostek zdefiniowanych przez użytkownika, do których odwołuje się nazwa, w definicji danej jednostki.
Innymi słowy, zwraca listę wszystkich jednostek zdefiniowanych przez użytkownika, od których zależy konkretna jednostka.
W szczególności raportuje o następujących typach encji, do których odwołuje się określony obiekt odniesienia:
- Eencje powiązane ze schematem
- Jednostki niezwiązane ze schematem
- Cross-database i cross-server encji
- Zależności na poziomie kolumny od jednostek powiązanych ze schematem i niezwiązanych ze schematem
- Typy zdefiniowane przez użytkownika (alias i CLR UDT)
- Kolekcje schematów XML
- Funkcje partycji
Składnia
Składnia wygląda tak:
sys.dm_sql_referenced_entities ( ' [ nazwa_schematu. ] nazwa_elementu_odniesienia ' , '' ) ::={ OBJECT | DATABASE_DDL_TRIGGER | SERVER_DDL_TRIGGER }
Przykład 1 – Przykład podstawowy
Oto przykład użycia:
USE Test; SELECT referenced_schema_name AS [Schema], referenced_entity_name AS Entity, referenced_minor_name AS Minor, referenced_class_desc AS Class, is_select_all, is_all_columns_foundFROM sys.dm_sql_referenced_entities ( 'dboient',);Wynik:
+----------+------------+---------------+------------- ---------+-----------------+---------------------- --+| Schemat | Podmiot | Drobne | Klasa | is_select_all | is_all_columns_found ||----------+------------+------------+---------- --------+-----------------+----------------------- -|| dbo | Klient | NULL | OBJECT_OR_COLUMN | 1 | 1 || dbo | Klient | Kod Klienta | OBJECT_OR_COLUMN | 1 | 1 || dbo | Klient | Imię | OBJECT_OR_COLUMN | 1 | 1 || dbo | Klient | Nazwisko | OBJECT_OR_COLUMN | 1 | 1 || NULL | kod klienta | NULL | TYP | 0 | 0 |+----------+----------------+---------------+---------- --------+-----------------+----------------------- -+Tutaj otrzymuję wszystkie jednostki, do których odwołuje się
dbo.uspGetClient
procedura składowana. W tym przypadku jest pięć podmiotów.Pierwszą z nich jest tabela o nazwie „Klient”. Kolejne trzy to wszystkie kolumny w tej tabeli. Ostatni to zdefiniowany przez użytkownika alias typu danych o nazwie „kod klienta”.
Widzimy również, że pierwsze cztery są używane w instrukcji select, która używa gwiazdki (
*
) symbol wieloznaczny, aby wybrać wszystkie kolumny (ponieważ ichis_select_all
jest ustawiony na1
).Oto rzeczywista definicja używana do tworzenia procedury składowanej, którą analizujemy:
CREATE PROCEDURE [dbo].[uspGetClient] @ClientCode kod klienta ASSELECT * FROM [dbo].[Klient]WHERE ClientCode =@ClientCode;Tak, to bardzo prosta procedura składowana, ale idealnie nadaje się do naszych celów. Możemy zobaczyć wszystkie jednostki, do których się odwołujemy, jako zwrócone przez
sys.dm_sql_referenced_entities()
.Widzimy również, że procedura składa się z pojedynczego
SELECT
zapytanie, które używa symbolu wieloznacznego gwiazdki do wybrania wszystkich kolumn.Przykład 2 – Usuń „Zaznacz wszystko” (
*
)Zmieńmy procedurę składowaną, aby nie używała symbolu wieloznacznego gwiazdki do zaznaczania wszystkich kolumn.
ALTER PROCEDURE [dbo].[uspGetClient] @ClientCode kod klienta ASSELECT Imię, LastNameFROM [dbo].[Klient]WHERE ClientCode =@ClientCode;Więc teraz jawnie zwraca kolumny "FirstName" i "LastName". Nie znaleziono symboli wieloznacznych.
Teraz uruchom
sys.dm_sql_referenced_entities()
ponownie:USE Test; SELECT referenced_schema_name AS [Schema], referenced_entity_name AS Entity, referenced_minor_name AS Minor, referenced_class_desc AS Class, is_select_all, is_all_columns_foundFROM sys.dm_sql_referenced_entities ( 'dboient',);Wynik:
+----------+------------+---------------+------------- ---------+-----------------+---------------------- --+| Schemat | Podmiot | Drobne | Klasa | is_select_all | is_all_columns_found ||----------+------------+------------+---------- --------+-----------------+----------------------- -|| dbo | Klient | NULL | OBJECT_OR_COLUMN | 0 | 1 || dbo | Klient | Kod Klienta | OBJECT_OR_COLUMN | 0 | 1 || dbo | Klient | Imię | OBJECT_OR_COLUMN | 0 | 1 || dbo | Klient | Nazwisko | OBJECT_OR_COLUMN | 0 | 1 || NULL | kod klienta | NULL | TYP | 0 | 0 |+----------+----------------+---------------+---------- --------+-----------------+----------------------- -+Tym razem
is_select_all
kolumna pokazuje0
we wszystkich wierszach.Przykład 3 – Odniesienie do nieistniejącego podmiotu
Co się stanie, jeśli twój podmiot odwołuje się do nieistniejącego podmiotu?
Na przykład, co się stanie, jeśli Twój kolega upuści kolumnę, do której faktycznie odwołuje się procedura składowana, a następnie uruchomisz
sys.dm_sql_referenced_entities()
przeciwko tej procedurze składowanej?Dowiedzmy się.
ALTER TABLE [dbo].[Klient] DROP COLUMN LastName;Właśnie upuściłem
LastName
kolumna z mojej tabeli.Teraz uruchom
sys.dm_sql_referenced_entities()
ponownie:SELECT nazwa_schematu_odwołanie AS [schemat], nazwa_podmiotu_odniesienia AS Entity, nazwa_podrzędnej_odniesienia AS Minor, klasa_odniesienia_klasy_desc AS, is_select_all, is_all_columns_foundFROM sys.dm_sql_referenced_entities ( „dbo.usp”>OBJECT”);Wynik:
Msg 207, Poziom 16, Stan 1, Procedura uspGetClient, Wiersz 4 Nieprawidłowa nazwa kolumny „Nazwisko”. Msg 2020, Poziom 16, Stan 1, Wiersz 3 Zależności zgłoszone dla encji „dbo.uspGetClient” mogą nie zawierać odwołań do wszystkich kolumn . Dzieje się tak, ponieważ jednostka odwołuje się do obiektu, który nie istnieje, lub z powodu błędu w jednej lub kilku instrukcjach w jednostce. Przed ponownym uruchomieniem zapytania upewnij się, że w encji nie ma błędów i że istnieją wszystkie obiekty, do których odwołuje się encja.Przykład 4 – Upuść całą tabelę
Dowiedzmy się, co się stanie, jeśli usuniemy całą tabelę.
Klient DROP TABLE;Tabela została usunięta.
Uruchom
sys.dm_sql_referenced_entities()
:SELECT nazwa_schematu_odwołanie AS [schemat], nazwa_podmiotu_odniesienia AS Entity, nazwa_podrzędnej_odniesienia AS Minor, klasa_odniesienia_klasy_desc AS, is_select_all, is_all_columns_foundFROM sys.dm_sql_referenced_entities ( „dbo.usp”>OBJECT”);Wynik:
Msg 2020, poziom 16, stan 1, wiersz 2 Zależności zgłoszone dla encji „dbo.uspGetClient” mogą nie zawierać odwołań do wszystkich kolumn. Dzieje się tak, ponieważ jednostka odwołuje się do obiektu, który nie istnieje, lub z powodu błędu w jednej lub kilku instrukcjach w jednostce. Przed ponownym uruchomieniem zapytania upewnij się, że w encji nie ma błędów i że istnieją wszystkie obiekty, do których odwołuje się encja.Przykład 5 – Zwróć wszystkie kolumny
Microsoft wyraźnie odradza używanie gwiazdki (
*
), aby wybrać wszystkie kolumny z dynamicznych widoków zarządzania i funkcji (z którychsys.dm_sql_referenced_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ć aplikację, jeśli polegasz na gwiazdki, aby wybrać wszystkie kolumny.To powiedziawszy, oto przykład, który właśnie to robi:używa gwiazdki (
*
), aby wybrać wszystkie kolumny zsys.dm_sql_referenced_entities()
. Robię to tylko po to, aby pokazać, jakie kolumny są faktycznie zwracane przez tę funkcję (przynajmniej w SQL Server 2019).WYBIERZ * Z sys.dm_sql_referenced_entities ( 'dbo.uspGetClient', 'OBJECT');Wynik (przy użyciu wyjścia pionowego):
-[ REKORD 1 ]-------------------------referencing_minor_id | 0referencyjna_nazwa_serwera | NULLreferenced_database_name | NULLreferenced_schema_name | dboreferenced_entity_name | Clientreferenced_minor_name | NULLreferenced_id | 434100587referenced_minor_id | 0referencyjna_klasa | 1referencyjna_klasa_opis | OBJECT_OR_COLUMNis_caller_dependent | 0jest_niejednoznaczny | 0is_selected | 1jest_zaktualizowany | 0is_select_all | 0is_all_columns_found | 1is_insert_all | 0is_niekompletne | 0-[ REKORD 2 ]-------------------------referencing_minor_id | 0referencyjna_nazwa_serwera | NULLreferencyjna nazwa_bazy danych | NULLreferenced_schema_name | dboreferenced_entity_name | Clientreferenced_minor_name | ClientCodereferenced_id | 434100587referenced_minor_id | 1 klasa_referencyjna | 1referencyjna_klasa_opis | OBJECT_OR_COLUMNis_caller_dependent | 0jest_niejednoznaczny | 0is_selected | 1jest_zaktualizowany | 0is_select_all | 0is_all_columns_found | 1is_insert_all | 0is_niekompletne | 0-[ REKORD 3 ]-------------------------referencing_minor_id | 0referencyjna_nazwa_serwera | NULLreferencyjna nazwa_bazy danych | NULLreferenced_schema_name | dboreferenced_entity_name | Clientreferenced_minor_name | FirstNamereferenced_id | 434100587referenced_minor_id | 2referencyjna_klasa | 1referencyjna_klasa_opis | OBJECT_OR_COLUMNis_caller_dependent | 0jest_niejednoznaczny | 0is_selected | 1jest_zaktualizowany | 0is_select_all | 0is_all_columns_found | 1is_insert_all | 0is_niekompletne | 0-[ REKORD 4 ]-------------------------referencing_minor_id | 0referencyjna_nazwa_serwera | NULLreferencyjna nazwa_bazy danych | NULLreferenced_schema_name | dboreferenced_entity_name | Clientreferenced_minor_name | LastNamereferenced_id | 434100587referenced_minor_id | 3referencyjna_klasa | 1referencyjna_klasa_opis | OBJECT_OR_COLUMNis_caller_dependent | 0jest_niejednoznaczny | 0is_selected | 1jest_zaktualizowany | 0is_select_all | 0is_all_columns_found | 1is_insert_all | 0is_niekompletne | 0-[ REKORD 5 ]-------------------------referencing_minor_id | 0referencyjna_nazwa_serwera | NULLreferencyjna nazwa_bazy danych | NULLreferenced_schema_name | NULLreferenced_entity_name | clientcodereferenced_minor_name | NULLreferenced_id | 257referenced_minor_id | 0referencyjna_klasa | 6referencyjna_klasa_opis | TYPEis_caller_dependent | 0jest_niejednoznaczny | 0is_selected | 0jest_zaktualizowany | 0is_select_all | 0is_all_columns_found | 0is_insert_all | 0is_niekompletne | 0(5 wierszy dotyczy)Oficjalna dokumentacja
Aby uzyskać bardziej szczegółowe informacje i przykłady, zobacz
sys.dm_sql_referenced_entities
na stronie Microsoft.