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

Znajdź jednostki odniesienia w SQL Server:sys.dm_sql_referencing_entities()

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zapytanie SQL, aby znaleźć ostatni dzień miesiąca

  2. SQL INSERT INTO z wielu tabel

  3. Grupy dostępności programu SQL Server AlwaysOn:instalacja i konfiguracja, część 1

  4. na czym polega problem z AttachDbFilename?

  5. Jak połączyć bazę danych programu Access z serwerem SQL w programie Access 2016