Grundlegendes zu SQL-Abhängigkeiten
SQL-Abhängigkeiten sind die Namensverweise, die in den SQL-Ausdrücken verwendet werden, die eine Entität von einer anderen Entität abhängig machen. Eine Entität, die in ihrer im Systemkatalog gespeicherten Definition auf eine andere Entität verweist, wird als verweisende Entität bezeichnet. Eine Entität, auf die von einer anderen Entität verwiesen wird, wird als Entität, auf die verwiesen wird bezeichnet. Es gibt zwei Typen der Abhängigkeit, die von Database Engine (Datenbankmodul) verfolgt werden.
Schemagebundene Abhängigkeit
Eine schemagebundene Abhängigkeit ist eine Beziehung zwischen zwei Entitäten, mit der verhindert wird, dass die Entität, auf die verwiesen wird, gelöscht oder geändert wird, solange die verweisende Entität vorhanden ist. Eine schemagebundene Abhängigkeit wird erstellt, wenn mit der WITH SCHEMABINDING-Klausel eine Sicht oder eine benutzerdefinierte Funktion erstellt wird. Eine schemagebundene Abhängigkeit kann auch dann erstellt werden, wenn eine Tabelle in der Definition einer berechneten Spalte oder einer CHECK- oder DEFAULT-Einschränkung auf eine andere Entität verweist, beispielsweise auf eine benutzerdefinierte Transact-SQL-Funktion, einen benutzerdefinierten Typ oder auf eine XML-Schemaauflistung. Die Angabe eines Objekts mit einem zweiteiligen Namen (schema_name.object_name), qualifiziert die Angabe nicht als schemagebundenen Verweis.
Nicht schemagebundene Abhängigkeit
Eine nicht schemagebundene Abhängigkeit ist eine Beziehung zwischen zwei Entitäten, mit der nicht verhindert wird, dass die Entität, auf die verwiesen wird, gelöscht oder geändert wird.
Die folgende Abbildung zeigt ein Beispiel für eine SQL-Abhängigkeit.
In der Abbildung sind zwei Entitäten dargestellt: Prozedur X und Prozedur Y. Prozedur X enthält einen SQL-Ausdruck mit einem Namensverweis auf Prozedur Y. Prozedur X wird als die verweisende oder abhängige Entität bezeichnet und Prozedur Y als die unabhängige Entität bzw. die Entität, auf die verwiesen wird. Da Prozedur X von Prozedur Y abhängig ist, ist Prozedur X mit einem Laufzeitfehler fehlerhaft, wenn Prozedur Y nicht vorhanden ist. Prozedur Y ist jedoch nicht fehlerhaft, wenn Prozedur X nicht vorhanden ist.
Das folgende Beispiel zeigt, wie die gespeicherte Prozedur X von der gespeicherten Prozedur Y abhängen kann.
USE tempdb;
GO
CREATE PROCEDURE dbo.Y AS
SELECT * FROM sys.objects
GO
CREATE PROCEDURE dbo.X as
EXEC dbo.Y;
GO
Um die Abhängigkeit zwischen X und Y anzuzeigen, führen Sie die folgende Abfrage aus.
SELECT *
FROM sys.sql_expression_dependencies
WHERE referencing_id = OBJECT_ID('X')
AND referenced_id = OBJECT_ID('Y')
AND referenced_schema_name = 'dbo'
AND referenced_entity_name = 'Y'
AND referenced_database_name IS NULL
AND referenced_server_name IS NULL;
GO
Typen von verweisenden Entitäten und Entitäten, auf die verwiesen wird
In der folgenden Tabelle werden die Typen von Entitäten aufgelistet, für die Abhängigkeitsinformationen erstellt und verwaltet werden. Die Tabelle gibt an, ob die Entität als verweisende Entität verfolgt wird oder als eine Entität, auf die verwiesen wird. Für Regeln, Standardwerte, temporäre Tabellen, temporär gespeicherte Prozeduren oder Systemobjekte werden keine Abhängigkeitsinformationen erstellt oder verwaltet.
Entitätstyp |
Verweisende Entität |
Entität, auf die verwiesen wird |
---|---|---|
Tabelle |
Ja* |
Ja |
Sicht |
Ja |
Ja |
In Transact-SQL gespeicherte Prozedur** |
Ja |
Ja |
CLR-gespeicherte Prozedur |
Nein |
Ja |
Benutzerdefinierte Transact-SQL-Funktion |
Ja |
Ja |
CLR-benutzerdefinierte Funktion |
Nein |
Ja |
CLR-Trigger (DML und DDL) |
Nein |
Nein |
Transact-SQL-DML-Trigger |
Ja |
Nein |
Transact-SQL-DDL-Trigger auf Datenbankebene |
Ja |
Nein |
DDL-Trigger auf Serverebene in Transact-SQL |
Ja |
Nein |
Erweiterte gespeicherte Prozeduren |
Nein |
Ja |
Warteschlange |
Nein |
Ja |
Synonym |
Nein |
Ja |
Typ (Alias und CLR-benutzerdefinierter Typ) |
Nein |
Ja |
XML-Schemaauflistung |
Nein |
Ja |
Partitionsfunktion |
Nein |
Ja |
* Eine Tabelle wird nur dann als verweisende Entität aufgezeichnet, wenn sie auf ein Transact-SQL-Modul, einen benutzerdefinierten Typ oder auf eine XML-Schemaauflistung in der Definition einer berechneten Spalte, einer CHECK-Einschränkung oder einer DEFAULT-Einschränkung verweist.
** Nummerierte gespeicherte Prozeduren mit einem ganzzahligen Wert größer als 1 werden weder als verweisende Entität noch als Entität, auf die verwiesen wird, aufgezeichnet.
Wie Abhängigkeitsinformationen verfolgt werden
Der Database Engine (Datenbankmodul) verfolgt diese Abhängigkeitsinformationen automatisch, wenn verweisende Entitäten erstellt, geändert oder gelöscht werden, und zeichnet diese Daten im SQL Server-Systemkatalog auf. Wenn Sie zum Beispiel einen Trigger erstellen, der auf eine Tabelle verweist, dann wird die Abhängigkeit zwischen diesen beiden Entitäten aufgezeichnet. Wenn Sie in der Folge den Trigger löschen, werden die Abhängigkeitsinformationen aus dem Systemkatalog entfernt.
Im Unterschied zu früheren Versionen von SQL Server, bei denen Abhängigkeiten nach ID überwacht wurden, werden Abhängigkeiten jetzt über Namen verfolgt. Dies bedeutet, dass Database Engine (Datenbankmodul) auch dann Abhängigkeitsinformationen zwischen zwei Entitäten verfolgt, wenn die Entität, auf die verwiesen wird, zum Zeitpunkt der Erstellung der verweisenden Entität noch nicht vorhanden ist. Dieser Umstand kann wegen verzögerter Namensauflösung auftreten. So kann beispielsweise eine gespeicherte Prozedur, die auf eine in der Datenbank noch nicht vorhandene Tabelle verweist, erfolgreich erstellt, jedoch nicht ausgeführt werden. Der Database Engine (Datenbankmodul) zeichnet die Abhängigkeit zwischen der Prozedur und der Tabelle auf. Eine ID für die Tabelle kann jedoch nicht aufgezeichnet werden, weil dieses Objekt noch nicht vorhanden ist. Wird die Tabelle später erstellt, wird ihre ID zusammen mit den anderen Abhängigkeitsinformationen zurückgegeben.
Abhängigkeitsinformationen werden verfolgt, wenn die Entität, auf die verwiesen wird, namentlich in einem permanenten SQL-Ausdruck des verweisenden Objekts aufgeführt wird. Abhängigkeitsinformationen werden bezogen, wenn auf Entitäten auf die folgenden Arten mit ihrem Namen verwiesen wird:
Durch das Verwenden einer der folgenden Anweisungen in der Definition eines Transact-SQL-Moduls:
DML-Anweisungen (Data Manipulation Language, Datenbearbeitungssprache) (SELECT, INSERT, UPDATE, DELETE, MERGE)
EXECUTE
DECLARE
SET (Wenn SET mit einer benutzerdefinierten Funktion oder einem benutzerdefinierten Typ verwendet wird. Zum Beispiel DECLARE @var int; SET @var = dbo.udf1.)
Entitäten, auf die in der Definition eines Transact-SQL-Moduls mithilfe von DDL-Anweisungen (Data Definition Language, Datendefinitionssprache) wie CREATE, ALTER oder DROP verwiesen wird, werden nicht verfolgt.
Durch die Verwendung von CREATE-, ALTER- oder DROP TABLE-Anweisungen, wobei sich die Anweisungen nicht in einem Transact-SQL-Modul befinden, und die Entität, auf die verwiesen wird, eine benutzerdefinierte Transact-SQL-Funktion, ein benutzerdefinierter Typ oder eine XML-Schemaauflistung ist, die in einer berechneten Spalte, einer CHECK-Einschränkung oder einer DEFAULT-Einschränkung definiert wurde.
Datenbankübergreifende und serverübergreifende Abhängigkeiten
Eine datenbankübergreifende Abhängigkeit entsteht dadurch, dass eine Entität mithilfe eines gültigen dreiteiligen Namens auf eine andere Entität verweist. Eine serverübergreifende Abhängigkeit entsteht, wenn eine Entität mithilfe eines gültigen vierteiligen Namens auf eine andere Entität verweist. Der Name des Servers und der Datenbank werden nur aufgezeichnet, wenn der Name explizit angegeben wird. Wird beispielsweise MyServer.MyDB.MySchema.MyTable angegeben, werden der Name des Servers und der Datenbank aufgezeichnet; wird dagegen MyServer..MySchema.MyTableangegeben, wird nur der Name des Servers aufgezeichnet. Weitere Informationen zu gültigen mehrteiligen Namen finden Sie unter Transact-SQL-Syntaxkonventionen (Transact-SQL).
Es gelten die folgenden Einschränkungen:
Serverübergreifende Abhängigkeiten für OPENROWSET-, OPENQUERY- und OPENDATASOURCE-Anweisungen werden nicht verfolgt.
Abhängigkeiten für die Anweisung EXEC ('…') AT linked_server wird nicht verfolgt.
Die folgende Tabelle fasst die datenbankübergreifenden und serverübergreifenden Abhängigkeiten, die verfolgt werden, und die Informationen, die im Systemkatalog aufgezeichnet und von sys.sql_expression_dependencies (Transact-SQL) berichtet werden, zusammen.
SQL-Ausdruck in einem Modul |
Wird verfolgt |
Servername, auf den verwiesen wird |
Datenbankname, auf den verwiesen wird |
Schemaname, auf den verwiesen wird |
Entitätsname, auf den verwiesen wird |
---|---|---|---|---|---|
SELECT * FROM s1.db2.sales.t1 |
Ja |
s1 |
db2 |
sales |
t1 |
SELECT * FROM db3..t1 |
Ja |
|
db3 |
|
t1 |
EXEC db2.dbo.Proc1 |
Ja |
|
db2 |
dbo |
proc1 |
EXEC ('…') AT linked_srv1 |
Nein |
|
|
|
|
EXEC linked_svr1.db2.sales.proc2 |
Ja |
linked_svr1 |
db2 |
sales |
proc2 |
Auswirkung der Sortierreihenfolge auf die Nachverfolgung von Abhängigkeiten
Eine Sortierreihenfolge legt die Regeln fest, nach denen Daten sortiert und verglichen werden. Die für die Datenbank gültige Sortierreihenfolge wird verwendet, um Abhängigkeitsinformationen für Entitäten innerhalb der Datenbank zu identifizieren. Wenn zum Beispiel eine gespeicherte Prozedur auf die Entitäten Some_Table und SOME_TABLE in einer Datenbank verweist, die eine Sortierung mit Berücksichtigung der Groß- und Kleinschreibung verwendet, werden Abhängigkeitsinformationen für beide Entitäten aufgezeichnet, weil ein Vergleich ihrer Namen ergibt, dass es sich um unterschiedliche Entitäten handelt. Wenn die Datenbank jedoch eine Sortierung verwendet, bei der zwischen Groß- und Kleinschreibung nicht unterschieden wird, dann wird nur eine einzige Abhängigkeit aufgezeichnet.
Bei serverübergreifenden und datenbankübergreifenden Abhängigkeiten wird die Sortierfolge des Servers verwendet, auf dem sich das verweisende Objekt befindet, um die Namen des Servers und der Datenbank aufzulösen. Die Sortierfolge der aktuellen Datenbank wird verwendet, um den Schemanamen und die Objektnamen aufzulösen:
Betrachten Sie die folgende Definition einer gespeicherten Prozedur. Wenn die gespeicherte Prozedur in einer Datenbank erstellt wird, die eine Sortierung mit Berücksichtigung der Groß- und Kleinschreibung verwendet, und diese Datenbank auf einer Instanz von SQL Server läuft, deren Sortierung die Groß- und Kleinschreibung nicht berücksichtigt, werden für die Entitäten srv_referenced.db_referenced.dbo.p_referenced und srv_referenced.db_referenced.DBO.P_REFERENCED zwei Abhängigkeiten aufgezeichnet.
CREATE PROCEDURE p_referencing AS
EXECUTE srv_referenced.db_referenced.dbo.p_referenced
EXECUTE srv_referenced.db_referenced.DBO.P_REFERENCED
EXECUTE SRV_REFERENCED.DB_REFERENCED.dbo.p_referenced;
Auflösen mehrdeutiger Verweise
Ein Verweis ist dann mehrdeutig, wenn er zur Laufzeit zu einer benutzerdefinierten Funktion, zu einem benutzerdefinierten Typ (UDT) oder zu einem XQuery-Verweis auf eine Spalte des Datentyps xml aufgelöst werden kann.
Betrachten Sie die folgende Definition einer gespeicherten Prozedur.
CREATE PROCEDURE dbo.p1 AS
SELECT column_a, Sales.GetOrder() FROM Sales.MySales;
Zum Zeitpunkt der Erstellung der gespeicherten Prozedur ist nicht bekannt, ob Sales.GetOrder() ein Verweis auf eine benutzerdefinierte Funktion namens GetOrder im Schema Sales oder auf eine Spalte namens Sales vom Typ UDT mit einer Methode namens GetOrder() ist. Ist ein Verweis mehrdeutig, dann wird die Abhängigkeit als mehrdeutig berichtet, indem die Spalte is_ambiguous in sys.sql_expression_dependencies und sys.dm_sql_referenced_entitites auf 1 festgelegt wird. Die folgenden Abhängigkeitsinformationen werden berichtet:
Die Abhängigkeit zwischen der gespeicherten Prozedur und der Tabelle.
Die Abhängigkeit zwischen der gespeicherten Prozedur und der benutzerdefinierten Funktion. Wenn die Funktion vorhanden ist, wird die ID der Funktion berichtet, andernfalls ist die ID NULL.
Die Abhängigkeit von der Funktion wird als mehrdeutig markiert. Das heißt, is_ambiguous wird auf 1 festgelegt.
Abhängigkeiten auf Spaltenebene werden nicht berichtet, weil die Anweisung, in der auf die Spalten verwiesen wird, nicht gebunden werden kann.
Beibehalten von Abhängigkeiten
Database Engine (Datenbankmodul) behält sowohl schemagebundene, als auch nicht schemagebundene Abhängigkeiten bei. Diese Abhängigkeiten werden automatisch bei jedem Vorgang aktualisiert, der sich auf die Nachverfolgung von Abhängigkeiten auswirkt, beispielsweise bei einem Update einer Datenbank von einer früheren Version von SQL Server oder bei einer Änderung der Sortierreihenfolge einer Datenbank.