DLL di terze parti nel CLR di SQL Server


14

Devo usare una DLL di terze parti in un codice c # di trigger in CLR di SQL Server

Ma quando provo ad aggiungere un riferimento, mostra solo alcune DLL di SQL Server.

Come posso aggiungere la mia dll di terze parti a SQL Server?


2
Allo stesso modo in cui aggiungi qualsiasi assembly CLR SQL ?

Risposte:


14

È possibile solo aggiungere riferimenti a quegli assembly che sono stati registrati con SQL Server. Se non sono registrati, non verranno visualizzati nella finestra di dialogo Aggiungi riferimenti.

Esistono diversi passaggi necessari per registrare una DLL, in primo luogo è necessario riconfigurare il database:

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

Fatto ciò, Sql Server è abilitato per CLR. Successivamente, dovrai registrare il tuo assembly:

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

Se quest'ultimo script viene eseguito correttamente, l'assembly è ora registrato e verrà visualizzato nella finestra di dialogo Aggiungi riferimenti.

Ciò che dovrete considerare, tuttavia, è la sicurezza dell'applicazione della configurazione CLR del vostro Sql Server:

  1. Preferisci registrare un assembly come SAFE, solo in circostanze eccezionali dovresti usare EXTERNAL_ACCESSo UNSAFE.
  2. Non aspettarti di essere in grado di fare tutto il possibile sul CLR full-trust (ovvero, non sul CLR ospitato da Sql Server): SQLCLR è un runtime sandbox.
  3. Non tentare di caricare gli assiemi in modo dinamico, poiché Assembly.Load()è intenzionalmente limitato.
  4. Potrebbe essere necessario assicurarsi che la libreria di terze parti sia firmata con una chiave pubblica se si prevede di utilizzarla UNSAFE.
  5. L'esecuzione del codice viene eseguita nel contesto dell'identità del servizio che esegue Sql Server (credo!)
  6. L'accesso al database effettuato da un assembly ospitato (ad es. Via context connection = true;) viene eseguito nel contesto dell'utente connesso, quindi è necessario assicurarsi di essere a conoscenza dell'accesso che tale libreria ha ai propri dati.

in 4 sopra devi scrivere l'assemblea. Ricevo quella parte e sono stato in grado di farlo tramite istruzioni autofirmate qui: geekswithblogs.net/ktegels/archive/2006/02/16/… Ma come installare il certificato quando non si dispone della chiave privata, ovvero quando l'assemblaggio è stato creato e firmato da una terza parte attendibile? Per quanto ne so nel link sopra la creazione del certificato richiede la presenza della chiave privata. Questo sembra renderlo impossibile?
JorgeSandoval,

2
Inoltre, contrassegnare db come affidabile è rischioso (e non necessario per l'installazione dell'assemblaggio "Sicuro"). Affidabile è un modo per aggirare la necessità di firmare gli assembly per autorizzazioni esterne / non sicure, ma non è raccomandato in quanto qualsiasi assembly CLR installato sarà attendibile ...
JorgeSandoval,

5

Suppongo che stai chiedendo alternative all'installazione di assembly CLR SQL da Visual Studio.

Non è necessario disporre del codice in Visual Studio.

La distribuzione di Oggetti database CLR su MSDN descrive in dettaglio le opzioni, tra cui istruzioni SQL e script di distribuzione.


1

Uso una DLL di terze parti molto grande che prende una pagina Web e la converte in un PDF.

Il PDF viene salvato su una condivisione file e il database viene aggiornato per posizione e tipo.

Questo è un processo in 3 passaggi:

  1. Crea un'app console che utilizza la DLL di terze parti per creare il PDF e accetta l'URL e FilePath come parametri e restituisce le dimensioni del PDF e il numero di pagine.

  2. Creare una procedura memorizzata CLR che quindi chiama l'app console sul server

  3. Ho inserito tutto in un'unica procedura memorizzata che chiama l'app CLR per creare il PDF e quindi scrivo i metadati su di esso nel database.

Mi rendo conto che non è perfetto e non dovresti assolutamente fare qualcosa di così folle in un grilletto!

Lo menziono solo qui per gli altri con domande sull'uso di DLL di terze parti nel loro CLR.

La mia speranza è che ruotando una console cmd.exe per eseguire la DLL di terze parti, invece di eseguire tutto in-proc, se si blocca, non influirà negativamente su SQL Server. Questo è quello che spero.

Si prega di commentare se questo è un approccio davvero negativo e perché.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.