Condividi tramite


Creazione di un assembly

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 MicrosoftSQL Server prima che sia possibile utilizzare le funzionalità fornite dall'assembly. Per registrare l'assembly in un database di SQL Server, utilizzare l'istruzione CREATE ASSEMBLY. In questo argomento viene descritto come registrare un assembly in un database tramite l'istruzione CREATE ASSEMBLY e specificare le impostazioni di protezione per l'assembly.

Istruzione CREATE ASSEMBLY

L'istruzione CREATE ASSEMBLY viene utilizzata per creare un assembly in un database. 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, la stessa lingua e la stessa chiave pubblica.

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

Agli utenti del database o ai ruoli utente vengono concesse autorizzazioni per creare, e pertanto 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 cui si fa riferimento è di proprietà dello stesso utente o ruolo.

  • L'assembly chiamato o cui si fa riferimento è stato creato nello stesso database.

Configurazione della protezione durante la creazione di assembly

Quando si crea un assembly in un database di SQL Server, è possibile specificare uno tra tre diversi livelli di protezione in cui eseguire il codice: SAFE, EXTERNAL_ACCESS o UNSAFE. Quando si esegue l'istruzione CREATE ASSEMBLY, nell'assembly di codice vengono effettuati alcuni controlli che possono impedire la registrazione dell'assembly nel server.

SAFE è il set di autorizzazioni predefinito e può essere utilizzato nella maggior parte degli scenari. Per specificare un determinato livello di protezione, è necessario modificare la sintassi dell'istruzione CREATE ASSEMBLY come indicato di seguito:

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

È inoltre possibile creare un assembly con il set di autorizzazioni SAFE omettendo semplicemente la terza riga del codice precedente:

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

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

Creazione di assembly EXTERNAL_ACCESS e UNSAFE

EXTERNAL_ACCESS consente di gestire scenari in cui il codice deve accedere a risorse esterne al server, ad esempio file, rete, Registro di sistema e variabili di ambiente. Ogni volta che il server accede a una risorsa esterna, rappresenta il contesto di protezione dell'utente che chiama il codice gestito.

L'autorizzazione UNSAFE per il codice è adatta in situazioni in cui un assembly non è effettivamente protetto o richiede accesso aggiuntivo a risorse limitate, ad esempio le API Microsoft Win32.

Per creare un assembly EXTERNAL_ACCESS o UNSAFE in SQL Server, deve verificarsi 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 in SQL Server come chiave asimmetrica (o certificato) e dispone di un account di accesso corrispondente con autorizzazione EXTERNAL ACCESS ASSEMBLY (per assembly di accesso esterni) o UNSAFE ASSEMBLY (per assembly non protetti).

  2. Il proprietario del database (DBO) dispone dell'autorizzazione EXTERNAL ACCESS ASSEMBLY (per assembly EXTERNAL ACCESS) o UNSAFE ASSEMBLY (per assembly UNSAFE) e il database ha la Proprietà di database TRUSTWORTHY impostata su ON.

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

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

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

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 utilizzato solo per concedere le autorizzazioni e non è necessario che sia associato a un utente o utilizzato nell'applicazione.

Per creare un assembly EXTERNAL ACCESS, è necessario disporre dell'autorizzazione EXTERNAL ACCESS. Questa autorizzazione viene specificata 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 alla chiave e quindi concedere l'autorizzazione UNSAFE all'account di accesso. Prima di eseguire l'istruzione CREATE ASSEMBLY, è necessario eseguire le istruzioni Transact-SQL seguenti.

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 indicare che un assembly viene caricato con l'autorizzazione UNSAFE, è necessario 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 ulteriori informazioni sulle autorizzazioni per ognuna di queste impostazioni, vedere Protezione per l'integrazione con CLR.

Cronologia modifiche

Aggiornamento del contenuto

Aggiunta di una nota relativa a come utilizzare l'account di accesso creato per la chiave asimmetrica.