Condividi tramite


Creare un assembly

Si applica a:SQL Server

Gli oggetti di database gestiti, ad esempio le stored procedure o i trigger, vengono compilati e quindi distribuiti in unità denominate assembly. Gli assembly DLL gestiti devono essere registrati in SQL Server prima che sia possibile usare la funzionalità fornita dall'assembly. Per registrare un assembly in un database di SQL Server, usare l'istruzione CREATE ASSEMBLY. Questo articolo illustra come registrare un assembly in un database usando l'istruzione CREATE ASSEMBLY e come specificare le impostazioni di sicurezza per l'assembly.

Istruzione CREATE ASSEMBLY

L'istruzione CREATE ASSEMBLY viene utilizzata per creare un assembly in un database. Ecco un esempio:

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

La clausola FROM specifica il percorso dell'assembly da creare. Questo percorso può essere un percorso UNC (Universal Naming Convention) o un percorso di file fisico locale rispetto al computer.

SQL Server non consente la registrazione di versioni diverse di un assembly con lo stesso nome, impostazioni cultura e chiave pubblica.

È possibile creare assembly che fanno riferimento ad altri assembly. Quando viene creato un assembly in SQL Server, SQL Server crea anche gli assembly a cui fa riferimento l'assembly a livello radice, se gli assembly a cui si fa riferimento non sono già stati creati nel database.

Agli utenti del database o ai ruoli utente vengono concesse le autorizzazioni necessarie per creare e quindi possedere assembly in un database. Per creare assembly, l'utente o il ruolo del database deve disporre dell'autorizzazione CREATE ASSEMBLY.

Un assembly può fare riferimento ad altri assembly solo nei casi seguenti:

  • L'assembly chiamato o a cui viene fatto riferimento è di proprietà dello stesso utente o ruolo.
  • L'assembly chiamato o a cui si fa riferimento è stato creato nello stesso database.

Specificare la sicurezza durante la creazione di assembly

Quando si crea un assembly in un database di SQL Server, è possibile specificare uno dei tre diversi livelli di sicurezza in cui è possibile eseguire il codice: SAFE, EXTERNAL_ACCESSo UNSAFE. Quando viene eseguita l'istruzione CREATE ASSEMBLY, alcuni controlli vengono eseguiti nell'assembly di codice, il che potrebbe causare l'errore di registrazione dell'assembly nel server.

SAFE è il set di autorizzazioni predefinito e funziona per la maggior parte degli scenari. Per specificare un determinato livello di sicurezza, modificare la sintassi dell'istruzione CREATE ASSEMBLY come indicato di seguito:

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

È anche possibile creare un assembly con il set di autorizzazioni SAFE omettendo la terza riga di precedente.

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

Quando il codice in un assembly viene eseguito nel set di autorizzazioni SAFE, può eseguire solo calcoli e accesso ai dati all'interno del server tramite il provider gestito in-process.

Creare assembly EXTERNAL_ACCESS e UNSAFE

EXTERNAL_ACCESS risolve gli scenari in cui il codice deve accedere alle risorse esterne al server, ad esempio file, rete, registro e variabili di ambiente. Ogni volta che il server accede a una risorsa esterna, rappresenta il contesto di sicurezza dell'utente che chiama il codice gestito.

UNSAFE'autorizzazione del codice riguarda le situazioni in cui un assembly non è verificabile o richiede un accesso aggiuntivo alle risorse con restrizioni, ad esempio l'API Win32.

Per creare un assembly EXTERNAL_ACCESS o UNSAFE in SQL Server, è necessario soddisfare una delle due condizioni seguenti:

  1. L'assembly è firmato con nome sicuro o dispone di firma Authenticode con un certificato. Questo nome sicuro (o certificato) viene creato all'interno di SQL Server come chiave asimmetrica (o certificato) e dispone di un account di accesso corrispondente con autorizzazione EXTERNAL ACCESS ASSEMBLY (per assembly di accesso esterno) o UNSAFE ASSEMBLY (per assembly non sicuri).

  2. Il proprietario del database (DBO) dispone dell'autorizzazione EXTERNAL ACCESS ASSEMBLY (per gli assembly EXTERNAL ACCESS) o UNSAFE ASSEMBLY (per gli assembly UNSAFE) e il database dispone della proprietà del database TRUSTWORTHY impostata su ON.

Le due condizioni elencate in precedenza vengono controllate anche in fase di caricamento dell'assembly ( che include l'esecuzione). Per caricare l'assembly, è necessario che si verifichi almeno una delle due condizioni.

È consigliabile che la proprietà di database TRUSTWORTHY in un database non sia impostata su ON solo per eseguire codice CLR (Common Language Runtime) nel processo del server. È invece consigliabile creare una chiave asimmetrica dal file di assembly nel database master. È quindi necessario creare un account di accesso mappato a questa chiave asimmetrica e concedere all'account di accesso EXTERNAL ACCESS ASSEMBLY o UNSAFE ASSEMBLY l'autorizzazione.

Le istruzioni Transact-SQL seguenti eseguono i passaggi necessari per creare una chiave asimmetrica, eseguire il mapping di un account di accesso a questa chiave e quindi concedere EXTERNAL_ACCESS autorizzazione all'account di accesso. È necessario eseguire le istruzioni Transact-SQL seguenti prima di eseguire l'istruzione CREATE ASSEMBLY.

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

Nota

È necessario creare un nuovo account di accesso da associare alla chiave asimmetrica. Questo account di accesso viene usato solo per concedere le autorizzazioni. Non deve essere associato a un utente o usato all'interno dell'applicazione.

Per creare un assembly EXTERNAL ACCESS, l'autore deve specificare EXTERNAL ACCESS autorizzazione durante la creazione dell'assembly:

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

Le istruzioni Transact-SQL seguenti eseguono i passaggi necessari per creare una chiave asimmetrica, eseguire il mapping di un account di accesso a questa chiave e quindi concedere UNSAFE autorizzazione all'account di accesso. È necessario eseguire le istruzioni Transact-SQL seguenti prima di eseguire l'istruzione CREATE ASSEMBLY.

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

Per specificare che un assembly viene caricato con UNSAFE autorizzazione, specificare il set di autorizzazioni UNSAFE durante il caricamento dell'assembly nel server:

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

Per altre informazioni sulle autorizzazioni per ognuna delle impostazioni, vedere sicurezza dell'integrazione con CLR.