Restrizioni del modello di programmazione per l'integrazione con CLR
Si applica a: SQL Server Istanza gestita di SQL di Azure
Quando si compila una stored procedure gestita o un altro oggetto di database gestito, SQL Server esegue determinati controlli di codice che devono essere considerati. Questi controlli vengono eseguiti sull'assembly del codice gestito quando vengono registrati per la prima volta nel database, usando l'istruzione CREATE ASSEMBLY
e anche in fase di esecuzione. Il codice gestito viene controllato anche in fase di esecuzione perché in un assembly potrebbero esserci percorsi di codice che potrebbero non essere mai effettivamente raggiunti in fase di esecuzione.
Questi controlli di codice offrono flessibilità per la registrazione di assembly di terze parti in particolare, in modo che un assembly non venga bloccato in cui è presente codice non sicuro progettato per l'esecuzione in un ambiente client, ma non verrà mai eseguito in Common Language Runtime (CLR) ospitato. I requisiti che il codice gestito deve soddisfare dipendono dal fatto che l'assembly sia registrato come SAFE
, EXTERNAL_ACCESS
o UNSAFE
. SAFE
è il livello di sicurezza più rigoroso.
Oltre alle restrizioni inserite negli assembly del codice gestito, vengono concesse anche delle autorizzazioni di sicurezza da accesso di codice. CLR supporta un modello di sicurezza per il codice gestito denominato CAS (Code Access Security). che prevede che le autorizzazioni vengano concesse agli assembly in base all'identità del codice. Gli assembly SAFE
, EXTERNAL_ACCESS
e UNSAFE
presentano autorizzazioni di protezione dall'accesso di codice diverse. Per altre informazioni, vedere ClR Integration Code Access Security.
Se i criteri dell'editore sono impostati, CREATE ASSEMBLY
ha esito negativo.
Controlli CREATE ASSEMBLY
Quando l'istruzione CREATE ASSEMBLY
viene eseguita, vengono eseguiti i controlli seguenti per ogni livello di sicurezza. Se un controllo ha esito negativo, CREATE ASSEMBLY
ha esito negativo e viene visualizzato un messaggio di errore.
Globale (qualsiasi livello di sicurezza)
Tutti gli assembly a cui si fa riferimento devono soddisfare uno o più dei criteri seguenti:
L'assembly è già registrato nel database.
L'assembly è uno degli assembly supportati. Per altre informazioni, vedere Librerie .NET Framework supportate.
Si sta usando
CREATE ASSEMBLY FROM <location>
e tutti gli assembly a cui si fa riferimento e le relative dipendenze sono disponibili in<location>
.Si sta usando
CREATE ASSEMBLY FROM <bytes ...>
e tutti i riferimenti vengono specificati tramite byte separati da spazi.
EXTERNAL_ACCESS
Tutti gli assembly EXTERNAL_ACCESS
devono soddisfare i criteri seguenti:
I campi statici non vengono usati per archiviare le informazioni. Sono consentiti campi statici di sola lettura.
Viene superato il test PEVerify. Lo strumento PEVerify (
peverify.exe
), che verifica che il codice CIL (Common Intermediate Language) e i metadati associati soddisfino i requisiti di sicurezza dei tipi, viene fornito con .NET Framework SDK.La sincronizzazione, ad esempio con la
SynchronizationAttribute
classe , non viene usata.I metodi finalizzatori non vengono usati.
Gli attributi personalizzati seguenti non sono consentiti negli assembly EXTERNAL_ACCESS
:
System.ContextStaticAttribute
System.MTAThreadAttribute
System.Runtime.CompilerServices.MethodImplAttribute
System.Runtime.CompilerServices.CompilationRelaxationsAttribute
System.Runtime.Remoting.Contexts.ContextAttribute
System.Runtime.Remoting.Contexts.SynchronizationAttribute
System.Runtime.InteropServices.DllImportAttribute
System.Security.Permissions.CodeAccessSecurityAttribute
System.Security.SuppressUnmanagedCodeSecurityAttribute
System.Security.UnverifiableCodeAttribute
System.STAThreadAttribute
System.ThreadStaticAttribute
SAFE
- Tutte le condizioni dell'assembly
EXTERNAL_ACCESS
vengono controllate.
controlli di runtime
In fase di esecuzione l'assembly del codice viene esaminato per verificare la presenza delle condizioni riportate di seguito. Se viene trovata una di queste condizioni, il codice gestito non è autorizzato a essere eseguito e viene generata un'eccezione.
UNSAFE
Non è possibile caricare un assembly in modo esplicito chiamando il System.Reflection.Assembly.Load()
metodo da una matrice di byte o usando Reflection.Emit
in modo implicito lo spazio dei nomi.
EXTERNAL_ACCESS
Tutte le condizioni di UNSAFE
vengono controllate.
Tutti i tipi e i metodi annotati con i valori dell'attributo di protezione host riportati di seguito dell'elenco supportato di assembly non sono consentiti.
SelfAffectingProcessMgmt
SelfAffectingThreading
Synchronization
SharedState
ExternalProcessMgmt
ExternalThreading
SecurityInfrastructure
MayLeakOnAbort
UI
Per altre informazioni su HPA e un elenco di tipi e membri non consentiti negli assembly supportati, vedere Attributi di protezione host e programmazione di integrazione CLR.
SAFE
Tutte le condizioni di EXTERNAL_ACCESS
vengono controllate.