Erstellen einer Assembly
Gilt für:SQL Server
Verwaltete Datenbankobjekte wie beispielsweise gespeicherte Prozeduren und Trigger werden kompiliert und dann in so genannten Assemblys bereitgestellt. Verwaltete DLL-Assemblys müssen in SQL Server registriert werden, bevor die Von der Assembly bereitgestellte Funktionalität verwendet werden kann. Verwenden Sie die CREATE ASSEMBLY
-Anweisung, um eine Assembly in einer SQL Server-Datenbank zu registrieren. In diesem Artikel wird erläutert, wie Sie eine Assembly in einer Datenbank mithilfe der CREATE ASSEMBLY
-Anweisung registrieren und die Sicherheitseinstellungen für die Assembly angeben.
Die CREATE ASSEMBLY-Anweisung
Die CREATE ASSEMBLY
-Anweisung wird verwendet, um eine Assembly in einer Datenbank zu erstellen. Hier ist ein Beispiel:
CREATE ASSEMBLY SQLCLRTest
FROM 'C:\MyDBApp\SQLCLRTest.dll';
Die FROM
-Klausel gibt den Pfadnamen der zu erstellenden Assembly an. Bei diesem Pfad kann es sich entweder um einen UNC-Pfad (Universal Naming Convention) oder einen physischen Dateipfad handeln, der sich lokal auf dem Rechner befindet.
SQL Server lässt die Registrierung verschiedener Versionen einer Assembly mit demselben Namen, derselben Kultur und einem öffentlichen Schlüssel nicht zu.
Es ist möglich, Assemblys zu erstellen, die auf andere Assemblys verweisen. Wenn eine Assembly in SQL Server erstellt wird, erstellt SQL Server auch die Assemblys, auf die von der Assembly auf Stammebene verwiesen wird, wenn die referenzierten Assemblys noch nicht in der Datenbank erstellt werden.
Datenbankbenutzer oder Benutzerrollen erhalten Berechtigungen zum Erstellen und daher eigenen Assemblys in einer Datenbank. Um Assemblys zu erstellen, sollte der Datenbankbenutzer oder die Datenbankrolle über die CREATE ASSEMBLY
Berechtigung verfügen.
Eine Assembly kann nur unter folgenden Voraussetzungen erfolgreich auf andere Assemblys verweisen:
- Die Assembly, die aufgerufen oder referenziert wird, gehört demselben Benutzer oder derselben Rolle.
- Die Assembly, die aufgerufen oder referenziert wird, wurde in derselben Datenbank erstellt.
Angeben der Sicherheit beim Erstellen von Assemblys
Beim Erstellen einer Assembly in einer SQL Server-Datenbank können Sie eine von drei verschiedenen Sicherheitsstufen angeben, in denen Ihr Code ausgeführt werden kann: SAFE
, EXTERNAL_ACCESS
oder UNSAFE
. Wenn die CREATE ASSEMBLY
-Anweisung ausgeführt wird, werden bestimmte Prüfungen für die Codeassembly ausgeführt, was dazu führen kann, dass die Assembly nicht auf dem Server registriert wird.
SAFE
ist der Standardberechtigungssatz und funktioniert für die meisten Szenarien. Um eine bestimmte Sicherheitsstufe anzugeben, ändern Sie die Syntax der CREATE ASSEMBLY
-Anweisung wie folgt:
CREATE ASSEMBLY SQLCLRTest
FROM 'C:\MyDBApp\SQLCLRTest.dll'
WITH PERMISSION_SET = SAFE;
Es ist auch möglich, eine Assembly mit dem SAFE
Berechtigungssatz zu erstellen, indem die dritte Zeile der vorherigen Zeile weggelassen wird.
CREATE ASSEMBLY SQLCLRTest
FROM 'C:\MyDBApp\SQLCLRTest.dll';
Wenn Code in einer Assembly unter dem SAFE
Berechtigungssatz ausgeführt wird, kann er nur den Berechnungs- und Datenzugriff innerhalb des Servers über den prozessinternen verwalteten Anbieter durchführen.
Erstellen von EXTERNAL_ACCESS- und UNSAFE-Assemblys
EXTERNAL_ACCESS
behandelt Szenarien, in denen der Code auf Ressourcen außerhalb des Servers zugreifen muss, z. B. Dateien, Netzwerk-, Registrierungs- und Umgebungsvariablen. Immer wenn der Server auf eine externe Ressource zugreift, verwendet er den Sicherheitskontext des Benutzers, der den verwalteten Code aufruft.
UNSAFE
Codeberechtigungen gelten für Situationen, in denen eine Assembly nicht nachweisbar sicher ist oder zusätzlichen Zugriff auf eingeschränkte Ressourcen erfordert, z. B. die Win32-API.
Um eine EXTERNAL_ACCESS
- oder UNSAFE
assembly in SQL Server zu erstellen, muss eine der folgenden beiden Bedingungen erfüllt sein:
Die Assembly wurde mit einem starken Namen oder Authenticode mit Zertifikat signiert. Dieser starke Name (oder Zertifikat) wird in SQL Server als asymmetrischer Schlüssel (oder Zertifikat) erstellt und verfügt über eine entsprechende Anmeldung mit
EXTERNAL ACCESS ASSEMBLY
Berechtigung (für Assemblys für externen Zugriff) oderUNSAFE ASSEMBLY
Berechtigung (für unsichere Assemblys).Der Datenbankbesitzer (DBO) verfügt über die Berechtigung
EXTERNAL ACCESS ASSEMBLY
(fürEXTERNAL ACCESS
Assemblys) oderUNSAFE ASSEMBLY
(fürUNSAFE
Assemblys), und die Datenbank verfügt über die VERTRAUENSWÜRDIGe Datenbankeigenschaft, aufON
festgelegt ist.
Die beiden zuvor aufgeführten Bedingungen werden auch zur Ladezeit der Assembly überprüft (einschließlich Ausführung). Mindestens eine der Bedingungen muss erfüllt sein, um die Assembly zu laden.
Es wird empfohlen, dass die VERTRAUENSWÜRDIGe Datenbankeigenschaft, die für eine Datenbank, nicht auf ON
festgelegt ist, wenn im Serverprozess nur CLR-Code (Common Language Runtime) ausgeführt wird. Stattdessen wird empfohlen, einen asymmetrischen Schlüssel aus der Assemblydatei in der master
-Datenbank zu erstellen. Anschließend muss ein login, der diesem asymmetrischen Schlüssel zugeordnet ist, erstellt werden, und die Anmeldung muss EXTERNAL ACCESS ASSEMBLY
oder UNSAFE ASSEMBLY
Berechtigung erteilt werden.
Die folgenden Transact-SQL Anweisungen führen die Schritte aus, die zum Erstellen eines asymmetrischen Schlüssels erforderlich sind, ordnen Sie diesem Schlüssel eine Anmeldung zu, und erteilen Sie dann EXTERNAL_ACCESS
Berechtigung für die Anmeldung. Sie müssen die folgenden Transact-SQL Anweisungen ausführen, bevor Sie die CREATE ASSEMBLY
-Anweisung ausführen.
USE master;
GO
CREATE ASYMMETRIC KEY SQLCLRTestKey
FROM EXECUTABLE FILE = 'C:\MyDBApp\SQLCLRTest.dll';
CREATE LOGIN SQLCLRTestLogin
FROM ASYMMETRIC KEY SQLCLRTestKey;
GRANT EXTERNAL ACCESS ASSEMBLY TO SQLCLRTestLogin;
GO
Hinweis
Sie müssen eine neue Anmeldung erstellen, die dem asymmetrischen Schlüssel zugeordnet wird. Diese Anmeldung wird nur verwendet, um Berechtigungen zu erteilen. Sie muss weder einem Benutzer zugeordnet noch innerhalb der Anwendung verwendet werden.
Um eine EXTERNAL ACCESS
-Assembly zu erstellen, muss der Ersteller beim Erstellen der Assembly EXTERNAL ACCESS
Berechtigung angeben:
CREATE ASSEMBLY SQLCLRTest
FROM 'C:\MyDBApp\SQLCLRTest.dll'
WITH PERMISSION_SET = EXTERNAL_ACCESS;
Die folgenden Transact-SQL Anweisungen führen die Schritte aus, die zum Erstellen eines asymmetrischen Schlüssels erforderlich sind, ordnen Sie diesem Schlüssel eine Anmeldung zu, und erteilen Sie dann UNSAFE
Berechtigung für die Anmeldung. Sie müssen die folgenden Transact-SQL Anweisungen ausführen, bevor Sie die CREATE ASSEMBLY
-Anweisung ausführen.
USE master;
GO
CREATE ASYMMETRIC KEY SQLCLRTestKey
FROM EXECUTABLE FILE = 'C:\MyDBApp\SQLCLRTest.dll';
CREATE LOGIN SQLCLRTestLogin
FROM ASYMMETRIC KEY SQLCLRTestKey;
GRANT UNSAFE ASSEMBLY TO SQLCLRTestLogin;
GO
Um anzugeben, dass eine Assembly mit UNSAFE
Berechtigung geladen wird, geben Sie den UNSAFE
Berechtigungssatz beim Laden der Assembly auf dem Server an:
CREATE ASSEMBLY SQLCLRTest
FROM 'C:\MyDBApp\SQLCLRTest.dll'
WITH PERMISSION_SET = UNSAFE;
Weitere Informationen zu den Berechtigungen für die einzelnen Einstellungen finden Sie unter CLR-Integrationssicherheit.