Erstellen von Assemblys

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 Microsoft SQL Server registriert werden, bevor die von der Assembly bereitgestellte Funktionalität verwendet werden kann. Um eine Assembly in einer SQL Server-Datenbank zu registrieren, verwenden Sie die CREATE ASSEMBLY-Anweisung. In diesem Thema wird erläutert, wie Sie eine Assembly mithilfe der CREATE ASSEMBLY-Anweisung in einer Datenbank registrieren und wie Sie die Sicherheitseinstellungen für die Assembly festlegen.

Die CREATE ASSEMBLY-Anweisung

Die CREATE ASSEMBLY-Anweisung dient zum Erstellen einer Assembly in einer Datenbank. Beispiel:

CREATE ASSEMBLY SQLCLRTest  
FROM 'C:\MyDBApp\SQLCLRTest.dll';  

Die FROM-Klausel legt den Pfadnamen der zu erstellenden Assembly fest. 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.

In SQL Server ist es nicht zulässig, verschiedene Versionen einer Assembly mit demselben Namen, derselben Kultur und demselben öffentlichen Schlüssel zu registrieren.

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 Assemblys, auf die verwiesen wird, nicht bereits in der Datenbank erstellt wurden.

Datenbankbenutzer oder Benutzerrollen erhalten Berechtigungen zum Erstellen von Assemblys in einer Datenbank, deren Besitzer sie dann sind. Um Assemblys zu erstellen, benötigt der Datenbankbenutzer oder die Rolle die CREATE ASSEMBLY-Berechtigung.

Eine Assembly kann nur unter folgenden Voraussetzungen erfolgreich auf andere Assemblys verweisen:

  • Die Assembly, die aufgerufen wird oder auf die verwiesen wird, gehört dem gleichen Benutzer oder der Rolle.

  • Die Assembly, die aufgerufen wird oder auf die verwiesen wird, wurde in derselben Datenbank erstellt.

Festlegen 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. Beim Ausführen der CREATE ASSEMBLY -Anweisung werden bestimmte Überprüfungen für die Code-Assembly durchgeführt, aufgrund derer die Assembly möglicherweise nicht beim Server registriert werden kann.

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;  

Sie können eine Assembly mit eingestellter SAFE -Berechtigung auch erstellen, indem Sie einfach die dritte Zeile des oben angegeben Codes auslassen:

CREATE ASSEMBLY SQLCLRTest  
FROM 'C:\MyDBApp\SQLCLRTest.dll';  

Wird der Code in einer Assembly mit eingestellter SAFE -Berechtigung ausgeführt, können Berechnungen und Datenzugriffe im Server ausschließlich über den prozessinternen verwalteten Anbieter erfolgen.

Erstellen von EXTERNAL_ACCESS- und UNSAFE-Assemblys

EXTERNAL_ACCESS wird für Szenarien verwendet, in denen der Code auf Ressourcen außerhalb des Servers zugreift, z. B. Datei-, Netzwerk-, Registrierungs- und Umgebungsvariablen. Immer wenn der Server auf eine externe Ressource zugreift, verwendet er den Sicherheitskontext des Benutzers, der den verwalteten Code aufruft.

DIE UNSAFE-Codeberechtigung gilt für Situationen, in denen eine Assembly nachweislich nicht sicher ist oder zusätzlichen Zugriff auf eingeschränkte Ressourcen erfordert, z. B. die Microsoft Win32-API.

Um eine EXTERNAL_ACCESS- oder UNSAFE-Assembly in SQL Server zu erstellen, muss eine der beiden folgenden Bedingungen erfüllt sein:

  1. Die Assembly wurde mit einem starken Namen oder Authenticode mit Zertifikat signiert. Dieser sichere Name (oder zertifikat) wird in SQL Server als asymmetrischer Schlüssel (oder Zertifikat) erstellt und verfügt über eine entsprechende Anmeldung mit der Berechtigung EXTERNAL ACCESS ASSEMBLY (für assemblys für externen Zugriff) oder UNSAFE ASSEMBLY (für unsichere Assemblys).

  2. Der Datenbankbesitzer (DBO) hat die Berechtigung EXTERNAL ACCESS ASSEMBLY (für EXTERNAL ACCESS -Assemblys) oder UNSAFE ASSEMBLY (für UNSAFE -Assemblys), und für die Datenbank ist TRUSTWORTHY Database Property auf ONeingestellt.

Die beiden oben aufgeführten Bedingungen werden auch zur Assemblyladezeit (dazu gehört auch die Ausführung) überprüft. Mindestens eine der Bedingungen muss erfüllt sein, um die Assembly zu laden.

Die Eigenschaft TRUSTWORTHY Database Property für die Datenbank sollte nicht auf ON gesetzt werden, um lediglich CLR-Code im Serverprozess auszuführen. Stattdessen empfiehlt es sich, dass ein asymmetrischer Schlüssel aus der Assemblydatei in der Masterdatenbank erstellt wird. Anschließend muss eine Anmeldung für diesen asymmetrischen Schlüssel erstellt werden, und die Anmeldung muss eine EXTERNAL ACCESS ASSEMBLY - oder UNSAFE ASSEMBLY -Berechtigung erhalten.

Die folgenden Transact-SQL-Anweisungen führen die Schritte aus, die erforderlich sind, um einen asymmetrischen Schlüssel zu erstellen, diesem Schlüssel eine Anmeldung zuzuordnen und dann EXTERNAL_ACCESS Berechtigung für die Anmeldung zu erteilen. 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 dient nur zum Erteilen von Berechtigungen. Sie muss weder einem Benutzer zugeordnet noch innerhalb der Anwendung verwendet werden.

Um eine EXTERNAL ACCESS -Assembly zu erstellen, muss der Ersteller die EXTERNAL ACCESS -Berechtigung haben. Diese wird beim Erstellen der Assembly angegeben:

CREATE ASSEMBLY SQLCLRTest  
FROM 'C:\MyDBApp\SQLCLRTest.dll'  
WITH PERMISSION_SET = EXTERNAL_ACCESS;  

Die folgenden Transact-SQL-Anweisungen führen die Schritte aus, die erforderlich sind, um einen asymmetrischen Schlüssel zu erstellen, diesem Schlüssel eine Anmeldung zuzuordnen und dann der Anmeldung die UNSAFE-Berechtigung zu erteilen. 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 festzulegen, dass eine Assembly mit UNSAFE -Berechtigung geladen wird, geben Sie die UNSAFE -Berechtigung beim Laden der Assembly auf den Server an:

CREATE ASSEMBLY SQLCLRTest  
FROM 'C:\MyDBApp\SQLCLRTest.dll'  
WITH PERMISSION_SET = UNSAFE;  

Weitere Informationen zu den Berechtigungen für die verschiedenen Einstellungen finden Sie unter CLR Integration Security.

Weitere Informationen

Verwalten von CLR-Integrationsassemblys
Ändern einer Assembly
Löschen von Assemblys
CLR-Integration und Codezugriffssicherheit
TRUSTWORTHY-Datenbankeigenschaft