Freigeben über


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_ACCESSoder 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:

  1. 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) oder UNSAFE ASSEMBLY Berechtigung (für unsichere Assemblys).

  2. Der Datenbankbesitzer (DBO) verfügt über die Berechtigung EXTERNAL ACCESS ASSEMBLY (für EXTERNAL ACCESS Assemblys) oder UNSAFE ASSEMBLY (für UNSAFE Assemblys), und die Datenbank verfügt über die VERTRAUENSWÜRDIGe Datenbankeigenschaft, auf ONfestgelegt 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.