Links in Sicherheit der CLR-Integration
In diesem Abschnitt wird beschrieben, wie in SQL Server Teile des Benutzercodes andere Benutzercodeteile in Transact-SQL oder einer der verwalteten Sprachen aufrufen können. Diese Beziehungen zwischen Objekten werden als Links bezeichnet.
Aufruflinks
Aufruflinks entsprechen einem Codeaufruf, beispielsweise wenn ein Benutzer ein Objekt (z. B. der Aufruf einer gespeicherten Prozedur durch einen Transact-SQL-Batch) oder eine gespeicherte CLR-Prozedur (Common Language Runtime) oder Funktion aufruft. Aufruflinks bewirken eine Überprüfung der EXECUTE-Berechtigung für den aufgerufenen Code.
Tabellenzugriffslinks
Tabellenzugriffslinks entsprechen dem Abrufen oder Ändern von Werten in einer Tabelle, Sicht oder Tabellenwertfunktion. Sie gleichen Aufruflinks, verfügen jedoch durch die SELECT-, INSERT-, UPDATE- und DELETE-Berechtigungen über eine differenziertere Zugriffssteuerung.
Gated Links
Gated Links bedeuten, dass die Berechtigungen für eine Objektbeziehung während der Ausführung nicht mehr überprüft werden, sobald die Beziehung hergestellt wurde. Wenn zwischen zwei Objekten (beispielsweise Objekt x und Objekt y) ein Gated Link besteht, dann werden die Berechtigungen für Objekt y und andere Objekte, auf die von Objekt y aus zugegriffen wird, nur während der Erstellung von Objekt x überprüft. Bei der Erstellung von Objekt x wird geprüft, ob der Besitzer von Objekt x über die REFERENCE-Berechtigung für das Objekt y verfügt. Während der Codeausführung (wenn beispielsweise das Objekt x aufgerufen wird) werden keine Berechtigungen für Objekt y oder andere Objekte überprüft, auf die dieses Objekt statisch verweist. Während der Ausführung wird überprüft, ob eine entsprechende Berechtigung für Objekt x selbst vorliegt.
Gated Links werden immer in Verbindung mit einer Metadatenabhängigkeit zwischen zwei Objekten verwendet. Diese Metadatenabhängigkeit ist eine Beziehung, die in SQL Server-Katalogen eingerichtet wird und verhindert, dass ein Objekt solange nicht freigegeben wird, solange ein anderes Objekt von ihm abhängt.
Gated Links sind nützlich, wenn es nicht angemessen oder praktikabel ist, vielen abhängigen Objekten Berechtigungen zu erteilen. Gated Links werden zwischen Objekten eingeführt, die Transact-SQL-Einstiegspunkte in CLR-Assemblys (z. B. CLR-Prozeduren, Trigger, Funktionen, Typen und Aggregate) und die Assemblys definieren, von denen diese definiert werden. Der Schutz dieser Objekte durch Gated Links hat zur Folge, dass ein in einer CLR-Assembly definierter Transact-SQL-Einstiegspunkt aufgerufen werden kann, wenn der Aufrufer über die entsprechende Berechtigung für diesen Transact-SQL-Eintrittspunkt verfügt. Der Aufrufer muss nicht über Berechtigungen für die Assembly oder andere Assemblys, auf die diese statisch verweist, verfügen. Die Berechtigungen für die Assembly werden zur Erstellungszeit des Transact-SQL-Einstiegspunkts überprüft.
Auf der SQL Server-Autorisierung basierende Sicherheit
Im Folgenden werden die Grundregeln beschrieben, die den SQL Server-Sicherheitsprüfungen von Aufrufen von und zwischen CLR-basierten Datenobjekten zugrunde liegen. Die ersten drei Regeln definieren, welche Berechtigungen für welches Objekt überprüft werden. Die vierte Regel definiert, für welchen Ausführungskontext die Berechtigung überprüft wird.
Sofern die Aufrufe nicht innerhalb desselben Objekts erfolgen, ist für alle Aufrufe die EXECUTE-Berechtigung erforderlich. Das bedeutet, dass für Aufrufe innerhalb einer Assembly keine Berechtigungen überprüft werden müssen. Die Berechtigung wird während der Ausführung überprüft.
Bei Gated Links ist eine REFERENCE-Berechtigung für das aufgerufene Objekt erforderlich, wenn das aufrufende Objekt erstellt wird. Bei der Objekterstellung wird geprüft, ob der Besitzer des aufrufenden Objekts über diese Berechtigung verfügt.
Tabellenzugriffslinks erfordern beim Zugriff auf die Tabelle oder Sicht die entsprechende SELECT, INSERT-, UPDATE- bzw. DELETE-Berechtigung.
Die Berechtigung wird im aktuellen Ausführungskontext überprüft. Prozeduren und Funktionen können mit einem Ausführungskontext erstellt werden, der sich vom Aufrufer unterscheidet. Assemblys werden immer mit dem Ausführungskontexts der Prozedur, der Funktion oder des Triggers erstellt, die bzw. der für sie definiert wurde.