it-swarm.com.de

Drittanbieter-DLL in SQL Server CLR

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

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

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

14
AVEbrahimi

Sie können nur Verweise auf Assemblys hinzufügen, die bei SQL Server registriert wurden. Wenn sie nicht registriert sind, werden sie nicht im Dialogfeld "Verweise hinzufügen" 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 Versammlung 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 berücksichtigen müssen, ist die Anwendungssicherheit Ihrer SQL Server CLR-Konfiguration:

  1. Registrieren Sie eine Assembly lieber als SAFE, nur in Ausnahmefällen sollten Sie EXTERNAL_ACCESS Oder UNSAFE verwenden.
  2. Erwarten Sie nicht, dass Sie mit Full-Trust-CLR (d. H. Nicht der von SQL Server gehosteten CLR) alles tun können, was Sie können - die SQLCLR ist eine Sandbox-Laufzeit.
  3. Versuchen Sie nicht, Assemblys dynamisch zu laden, da 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 UNSAFE verwenden möchten.
  5. Das Ausführen von Code wird im Kontext der Identität des Dienstes ausgeführt, auf dem SQL Server ausgeführt wird (glaube ich!).
  6. Der Datenbankzugriff von einer gehosteten Assembly (z. B. über context connection = true;) Wird im Kontext des verbundenen Benutzers ausgeführt. Sie müssen daher sicherstellen, dass Sie wissen, welchen Zugriff diese Bibliothek auf Ihre Daten hat.
15
Matthew Abbott

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

Der Code in Visual Studio ist nicht erforderlich.

Bereitstellen von CLR-Datenbankobjekten in MSDN beschreibt die Optionen, einschließlich SQL-Anweisungen und Bereitstellungsskripts.

5
Oded

Ich verwende einen sehr großen Drittanbieter DLL, der eine Webseite in ein PDF konvertiert.

Das PDF wird auf einer Dateifreigabe gespeichert und die Datenbank wird hinsichtlich Speicherort und Typ aktualisiert.

Dies ist ein dreistufiger Prozess:

  1. Erstellen Sie eine Konsolen-App, die die DLL von Drittanbietern PDF erstellt, die URL und den Dateipfad als Parameter akzeptiert und die Größe und Anzahl der Seiten PDF zurückgibt.

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

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

Mir ist klar, dass dies nicht perfekt ist und Sie sollten auf keinen Fall 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 durch das Abspalten einer cmd.exe-Konsole zum Ausführen der DLL eines Drittanbieters SQL Server nicht so stark beeinträchtigt 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.

1
MikeTeeVee