Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Znajdź jednostki odniesienia w SQL Server:sys.dm_sql_referenced_entities

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ż ich is_select_all jest ustawiony na 1 ).

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 pokazuje 0 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órych sys.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 z sys.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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Problemy z replikacją transakcyjną programu SQL Server

  2. SQL Server 2005 ROW_NUMBER() bez ORDER BY

  3. Czy używasz odpowiednich narzędzi do monitorowania wydajności bazy danych?

  4. Wygeneruj zestaw wyników inkrementacji dat w TSQL

  5. ExecuteReader wymaga otwartego i dostępnego połączenia. Obecny stan połączenia to Łączenie