Drittanbieter-DLL in SQL Server CLR

14

Ich muss eine Drittanbieter-DLL in einem Trigger-C # -Code in SQL Server CLR verwenden

Wenn ich jedoch versuche, einen Verweis hinzuzufügen, werden nur einige DLLs von SQL Server angezeigt.

Wie kann ich meine Drittanbieter-DLL zu SQL Server hinzufügen ?

Solomon Rutzky
quelle
2
Auf die gleiche Weise fügen Sie SQL CLR-Assemblys hinzu ?

Antworten:

14

Sie können nur Verweise auf die Assemblys hinzufügen, die bei SQL Server registriert wurden. Wenn sie nicht registriert sind, werden sie im Dialogfeld "Verweise hinzufügen" nicht angezeigt.

Es gibt eine Reihe von Schritten, die Sie zum Registrieren einer DLL ausführen müssen. Zunächst müssen Sie Ihre Datenbank neu konfigurieren:

ALTER DATABASE [MyDatabase] SET TRUSTWORTHY ON;
sp_configure 'clr enabled', 1;
RECONFIGURE;

Sobald dies erledigt ist, ist SQL Server CLR-fähig. Als Nächstes müssen Sie Ihre Assembly registrieren:

CREATE ASSEMBLY [MyAssembly] AUTHORIZATION [MyUser]
FROM 'C:\CLR\MyAssembly.dll'
WITH PERMISSION_SET = SAFE

Wenn dieses letzte Skript ordnungsgemäß ausgeführt wird, ist die Assembly jetzt registriert und wird im Dialogfeld Verweise hinzufügen angezeigt.

Was Sie jedoch beachten müssen, ist die Anwendungssicherheit Ihrer SQL Server CLR-Konfiguration:

  1. Ziehen Sie es vor, eine Assembly zu registrieren, da SAFESie EXTERNAL_ACCESSoder nur in Ausnahmefällen verwenden sollten UNSAFE.
  2. Erwarten Sie nicht, dass Sie in der voll vertrauenswürdigen CLR (dh nicht in der von SQL Server gehosteten CLR) alles tun können - die SQLCLR ist eine Sandbox-Laufzeit.
  3. Versuchen Sie nicht, Baugruppen dynamisch zu laden, da dies Assembly.Load()absichtlich eingeschränkt ist.
  4. Möglicherweise müssen Sie sicherstellen, dass die Bibliothek eines Drittanbieters mit einem öffentlichen Schlüssel signiert ist, wenn Sie die Verwendung planen UNSAFE.
  5. Die Ausführung von Code erfolgt im Kontext der Identität des Dienstes, auf dem SQL Server ausgeführt wird (glaube ich!)
  6. Der Datenbankzugriff über eine gehostete Assembly (z. B. über context connection = true;) wird im Kontext des verbundenen Benutzers ausgeführt. Sie müssen also sicherstellen, dass Sie wissen, über welchen Zugriff diese Bibliothek auf Ihre Daten verfügt.
Matthew Abbott
quelle
In 4 oben musst du die Versammlung unterschreiben. Ich habe diesen Teil erhalten und konnte ihn mithilfe einer selbstsignierten Anleitung hier ausführen : geekswithblogs.net/ktegels/archive/2006/02/16/… Aber wie installiere ich das Zertifikat, wenn Sie keinen privaten Schlüssel haben, dh wann ? Assembly wurde von einem vertrauenswürdigen Dritten erstellt und signiert? Soweit ich im obigen Link sehen kann, muss für die Erstellung des Zertifikats ein privater Schlüssel vorhanden sein. Das scheint das unmöglich zu machen?
JorgeSandoval
2
Außerdem ist die Kennzeichnung von db als vertrauenswürdig riskant (und für die "sichere" Montage nicht erforderlich). Vertrauenswürdig ist ein Weg, um Assemblys für externe / unsichere Berechtigungen signieren zu müssen, aber nicht zu empfehlen, da eine installierte CLR-Assembly als vertrauenswürdig eingestuft wird ...
JorgeSandoval
5

Ich gehe davon aus, dass Sie nach Alternativen zur Installation von SQL CLR-Assemblys in Visual Studio fragen.

Der Code in Visual Studio ist nicht erforderlich.

Durch das Bereitstellen von CLR-Datenbankobjekten auf MSDN werden die Optionen, einschließlich SQL-Anweisungen und Bereitstellungsskripten, detailliert beschrieben.

Oded
quelle
1

Ich verwende eine sehr große DLL von Drittanbietern, die eine Webseite aufnimmt und in eine PDF-Datei konvertiert.

Die PDF-Datei wird auf einer Dateifreigabe gespeichert und die Datenbank wird in Bezug auf Speicherort und Typ aktualisiert.

Dies ist ein dreistufiger Prozess:

  1. Erstellen Sie eine Konsolenanwendung, die die Drittanbieter-DLL zum Erstellen der PDF-Datei verwendet, die URL und FilePath als Parameter akzeptiert und die PDF-Größe sowie die Anzahl der Seiten zurückgibt.

  2. Erstellen Sie eine gespeicherte CLR-Prozedur, die dann die Konsolenanwendung auf dem Server aufruft

  3. Ich packe das alles in eine einzige gespeicherte Prozedur, die die CLR-App aufruft, um die PDF-Datei zu erstellen, und schreibe dann Metadaten darüber in die Datenbank.

Mir ist klar, dass dies nicht perfekt ist, und Sie sollten keinesfalls etwas so Verrücktes in einem Abzug tun!

Ich erwähne es hier nur für andere, die Fragen zur Verwendung von DLLs von Drittanbietern in ihrer CLR haben.

Ich hoffe, dass SQL Server nicht so stark beeinträchtigt wird, wenn eine cmd.exe-Konsole zum Ausführen der DLL von Drittanbietern heruntergefahren wird, anstatt alles in-proc auszuführen, wenn es abstürzt. Das hoffe ich.

Bitte kommentieren Sie, ob dies ein wirklich schlechter Ansatz ist und warum.

MikeTeeVee
quelle