Condividi tramite


ALTER ASSEMBLY (Transact-SQL)

Si applica a: SQL Server Istanza gestita di SQL di Azure

Modifica un assembly cambiando le proprietà di catalogo di SQL Server di un assembly. ALTER ASSEMBLY lo aggiorna alla copia più recente dei moduli .NET Framework che contengono l'implementazione e aggiunge o rimuove i file associati. Gli assembly vengono creati tramite l'istruzione CREATE ASSEMBLY.

Convenzioni relative alla sintassi Transact-SQL

Sintassi

ALTER ASSEMBLY assembly_name
    [ FROM <client_assembly_specifier> | <assembly_bits> ]
    [ WITH <assembly_option> [ , ...n ] ]
    [ DROP FILE { file_name [ , ...n ] | ALL } ]
    [ ADD FILE FROM
    {
        client_file_specifier [ AS file_name ]
      | file_bits AS file_name
    } [ , ...n ]
    ] [ ; ]
<client_assembly_specifier> ::=
    '\\computer_name\share-name\ [ path\ ] manifest_file_name '
  | '[ local_path\ ] manifest_file_name'

<assembly_bits> ::=
    { varbinary_literal | varbinary_expression }

<assembly_option> ::=
    PERMISSION_SET = { SAFE | EXTERNAL_ACCESS | UNSAFE }
  | VISIBILITY = { ON | OFF }
  | UNCHECKED DATA

Argomenti

assembly_name

Nome dell'assembly da modificare. assembly_name non deve essere già esistente nel database.

FROM <client_assembly_specifier> | <assembly_bits>

Aggiorna un assembly in base alla copia più recente dei moduli .NET Framework contenenti la relativa implementazione. È possibile usare questa opzione solo se non esistono file associati all'assembly specificato.

<client_assembly_specifier> specifica il percorso di rete o il percorso locale in cui si trova l'assembly in fase di aggiornamento. Il percorso di rete include il nome del computer, il nome della condivisione e un percorso all'interno di tale condivisione. manifest_file_name specifica il nome del file contenente il manifesto dell'assembly.

Importante

database SQL di Azure non supporta il riferimento a un file.

<assembly_bits> rappresenta il valore binario dell'assembly.

Le istruzioni separate ALTER ASSEMBLY devono essere rilasciate per tutti gli assembly dipendenti che richiedono anche l'aggiornamento.

PERMISSION_SET = { SAFE | EXTERNAL_ACCESS | UNSAFE }

Specifica la proprietà del set di autorizzazioni per l'accesso al codice NET Framework dell'assembly. Per altre informazioni su questa proprietà, vedere CREATE ASSEMBLY.

L'opzione PERMISSION_SET è interessata dall'opzione di sicurezza clr strict. Quando l'opzione clr strict security è abilitata, tutti gli assembly vengono considerati come UNSAFE.

Le EXTERNAL_ACCESS opzioni e UNSAFE non sono disponibili in un database indipendente.

VISIBILITY = { ON | OFF }

Specifica se l'assembly risulta visibile per la creazione in base a esso di funzioni CLR (Common Language Runtime), stored procedure, trigger, tipi definiti dall'utente e funzioni di aggregazione definite dall'utente. Se impostato su OFF, l'assembly deve essere chiamato solo da altri assembly. Se nell'assembly sono già stati creati oggetti di database CLR esistenti, la visibilità dell'assembly non può essere modificata. Per impostazione predefinita, gli eventuali assembly a cui assembly_name fa riferimento vengono caricati come non visibili.

UNCHECKED DATA

Per impostazione predefinita, ALTER ASSEMBLY ha esito negativo se deve verificare la coerenza delle singole righe della tabella. Questa opzione consente di posticipare i controlli fino a un secondo momento usando DBCC CHECKTABLE. Se specificato, SQL Server esegue l'istruzione ALTER ASSEMBLY anche se nel database sono presenti tabelle che contengono le condizioni seguenti:

  • Colonne calcolate persistenti che fanno riferimento direttamente o indirettamente ai metodi dell'assembly tramite funzioni o metodi Transact-SQL.

  • CHECK vincoli che fanno riferimento direttamente o indirettamente ai metodi nell'assembly.

  • Colonne di un tipo CLR definito dall'utente che dipendono dall'assembly e il tipo implementa un UserDefined formato di serializzazione (non).Native

  • Colonne di un tipo CLR definito dall'utente che fanno riferimento alle viste create tramite WITH SCHEMABINDING.

CHECK Se sono presenti vincoli, vengono disabilitati e contrassegnati come non attendibili. Le tabelle contenenti colonne che dipendono dall'assembly vengono contrassegnate come contenenti dati non controllati finché tali tabelle non vengono verificate in modo esplicito.

Solo i membri dei ruoli predefiniti del database db_owner e db_ddlowner possono specificare questa opzione.

Richiede l'autorizzazione ALTER ANY SCHEMA per specificare questa opzione.

Per altre informazioni, vedere Implementazione di assembly.

DROP FILE { file_name [ ,... n ] | ALL }

Rimuove il nome file associato all'assembly oppure tutti i file associati all'assembly dal database. Se usato con ADD FILE il codice seguente, DROP FILE viene eseguito per primo. In questo modo è possibile sostituire un file con lo stesso nome di file.

Nota

Questa opzione non è disponibile in un database indipendente o database SQL di Azure.

ADD FILE FROM { client_file_specifier [ AS file_name ] | file_bits AS file_name }

Carica un file da associare all'assembly, ad esempio codice sorgente, file di debug o altre informazioni correlate, nel server e reso visibile nella vista del sys.assembly_files catalogo. client_file_specifier specifica il percorso dal quale caricare il file. In alternativa è possibile usare file_bits per specificare l'elenco di valori binari che compongono il file. file_name specifica il nome in base al quale il file deve essere archiviato nell'istanza di SQL Server. Specificare file_name se file_bits è specificato. È invece facoltativo se è specificato client_file_specifier. Se file_name non viene specificato, la parte file_name di client_file_specifier viene usata come file_name.

Nota

Questa opzione non è disponibile in un database indipendente o database SQL di Azure.

La sicurezza dall’accesso di codice non è più supportata

CLR usa la Sicurezza dall'accesso di codice (CAS, Code Access Security) in .NET Framework, non più supportata come limite di sicurezza. Un assembly CLR creato con PERMISSION_SET = SAFE potrebbe essere in grado di accedere alle risorse di sistema esterne, chiamare codice non gestito e acquisire privilegi sysadmin. In SQL Server 2017 (14.x) e versioni successive, l'opzione sp_configure clr strict security migliora la sicurezza degli assembly CLR. clr strict security è abilitata per impostazione predefinita e considera gli assembly CLR SAFE e UNSAFE come se fossero contrassegnati EXTERNAL_ACCESS. È possibile disabilitare l'opzione clr strict security per la compatibilità con le versioni precedenti, ma questa operazione è sconsigliata.

Si consiglia di firmare tutti gli assembly con un certificato o una chiave asimmetrica tramite un account di accesso corrispondente che disponga dell'autorizzazione UNSAFE ASSEMBLY nel database master. Gli amministratori di SQL Server possono anche aggiungere assembly a un elenco di assembly, considerato attendibile dal motore di database. Per altre, vedere sys.sp_add_trusted_assembly.

Osservazioni:

ALTER ASSEMBLY non interrompe le sessioni attualmente in esecuzione che eseguono codice nell'assembly da modificare. Le sessioni correnti completano l'esecuzione tramite l'utilizzo dei bit non modificati dell'assembly.

Se la FROM clausola viene specificata, ALTER ASSEMBLY aggiorna l'assembly in relazione alle copie più recenti dei moduli forniti. Poiché potrebbero essere presenti funzioni CLR, stored procedure, trigger, tipi di dati e funzioni di aggregazione definite dall'utente nell'istanza di SQL Server già definite per l'assembly, l'istruzione ALTER ASSEMBLY li riassocia all'implementazione più recente dell'assembly. Per eseguire questa riassociazione, è necessario che i metodi che eseguono il mapping alle funzioni CLR, alle stored procedure e ai trigger esistano nell'assembly modificati con le stesse firme. Le classi che implementano i tipi CLR definiti dall'utente e le funzioni di aggregazione definite dall'utente devono continuare a soddisfare i requisiti richiesti per i tipi e le funzioni di aggregazione definiti dall'utente.

Attenzione

Se WITH UNCHECKED DATA non è specificato, SQL Server tenta di impedire ALTER ASSEMBLY l'esecuzione se la nuova versione dell'assembly influisce sui dati esistenti in tabelle, indici o altri siti persistenti. SQL Server, tuttavia, non garantisce che le colonne calcolate, gli indici, le viste indicizzate o le espressioni siano coerenti con le routine e i tipi sottostanti quando viene aggiornato l'assembly CLR. Prestare attenzione quando si esegue ALTER ASSEMBLY per assicurarsi che non vi sia una mancata corrispondenza tra il risultato di un'espressione e un valore basato su tale espressione archiviata nell'assembly.

ALTER ASSEMBLY modifica la versione dell'assembly. La lingua e il token di chiave pubblica dell'assembly restano invariati.

L'istruzione ALTER ASSEMBLY non può essere usata per modificare gli elementi seguenti:

  • Le firme di funzioni CLR, le funzioni di aggregazione, le stored procedure e i trigger in un'istanza di SQL Server che fanno riferimento all'assembly. L'istruzione ALTER ASSEMBLY ha esito negativo quando SQL Server non riesce a riassociare oggetti di database .NET Framework in SQL Server con la nuova versione dell'assembly.

  • Le firme dei metodi nell'assembly chiamati da altri assembly.

  • Elenco di assembly che dipendono dall'assembly, come indicato nella DependentList proprietà dell'assembly.

  • L'indicizzabilità di un metodo a meno che non esista alcun indice o colonna calcolata persistente che dipende da tale metodo, direttamente o indirettamente.

  • Attributo FillRow del nome del metodo per le funzioni CLR con valori di tabella.

  • Firma del Accumulate metodo e Terminate per le aggregazioni definite dall'utente.

  • Gli assembly di sistema.

  • La proprietà degli assembly. In alternativa, usare ALTER AUTHORIZATION .

Inoltre, per gli assembly che implementano tipi definiti dall'utente, ALTER ASSEMBLY è possibile usare solo le modifiche seguenti:

  • Modifica dei metodi pubblici della classe del tipo definito dall'utente, purché le firme o gli attributi non siano modificati.

  • Aggiunta di nuovi metodi pubblici.

  • Modifica di metodi privati.

I campi contenuti in un tipo definito dall'utente serializzato nativo, inclusi i membri dati o le classi di base, non possono essere modificati tramite ALTER ASSEMBLY. Tutte le altre modifiche non sono supportate.

Se ADD FILE FROM non viene specificato, ALTER ASSEMBLY elimina tutti i file associati all'assembly.

Se ALTER ASSEMBLY viene eseguito senza la UNCHECKED clausola dati, vengono eseguiti controlli per verificare che la nuova versione dell'assembly non influisca sui dati esistenti nelle tabelle. A seconda della quantità di dati da controllare, questo passaggio potrebbe influire sulle prestazioni.

Autorizzazioni

È necessaria ALTER l'autorizzazione per l'assembly. È inoltre necessario disporre dei requisiti seguenti:

  • Per modificare un assembly il cui set di autorizzazioni esistente è EXTERNAL_ACCESS, è necessaria EXTERNAL ACCESS ASSEMBLY l'autorizzazione per il server.

  • Per modificare un assembly il cui set di autorizzazioni esistente è UNSAFE necessaria UNSAFE ASSEMBLY l'autorizzazione per il server.

  • Per modificare il set di autorizzazioni di un assembly in EXTERNAL_ACCESS, è necessaria EXTERNAL ACCESS ASSEMBLY l'autorizzazione per il server.

  • Per modificare il set di autorizzazioni di un assembly in UNSAFE, è necessaria UNSAFE ASSEMBLY l'autorizzazione per il server.

  • Per specificare WITH UNCHECKED DATA è necessaria ALTER ANY SCHEMA l'autorizzazione.

Autorizzazioni con CLR strict security

Sono necessarie le autorizzazioni seguenti per modificare un assembly CLR con clr strict security abilitata:

  • L'utente deve disporre dell'autorizzazione ALTER ASSEMBLY

  • Inoltre, una delle condizioni seguenti deve essere rispettata:

    • L'assembly è firmato con un certificato o una chiave asimmetrica con un account di accesso corrispondente con l'autorizzazione UNSAFE ASSEMBLY nel server. È consigliabile firmare l'assembly.

    • La proprietà TRUSTWORTHY del database è impostata su ON e il database è di proprietà di un accesso che dispone dell'autorizzazione UNSAFE ASSEMBLY nel server. Questa opzione non è consigliata.

Per altre informazioni sui set di autorizzazioni di assembly, vedere Progettazione di assembly.

Esempi

R. Aggiornare un assembly

Nell'esempio seguente l'assembly ComplexNumber viene aggiornato in base alla copia più recente dei moduli di .NET Framework contenenti la relativa implementazione.

Nota

L'assembly ComplexNumber può essere creato eseguendo gli UserDefinedDataType script di esempio. Per altre informazioni, vedere Tipo definito dall'utente.

 ALTER ASSEMBLY ComplexNumber
 FROM 'C:\Program Files\Microsoft SQL Server\130\Tools\Samples\1033\Engine\Programmability\CLR\UserDefinedDataType\CS\ComplexNumber\obj\Debug\ComplexNumber.dll'

Importante

database SQL di Azure non supporta il riferimento a un file.

B. Aggiungere un file da associare a un assembly

Nell'esempio seguente viene caricato il file del codice sorgente Class1.cs da associare all'assembly MyClass. In questo esempio si presuppone che l'assembly MyClass sia già stato creato nel database.

ALTER ASSEMBLY MyClass
ADD FILE FROM 'C:\MyClassProject\Class1.cs';

Importante

database SQL di Azure non supporta il riferimento a un file.

C. Modificare le autorizzazioni di un assembly

Nell'esempio seguente il set di autorizzazioni dell'assembly ComplexNumber viene modificato da SAFE a EXTERNAL ACCESS.

ALTER ASSEMBLY ComplexNumber WITH PERMISSION_SET = EXTERNAL_ACCESS;