Beschränkungen des Programmiermodells für die CLR-Integration

Gilt für:SQL ServerAzure SQL Managed Instance

Wenn Sie eine verwaltete gespeicherte Prozedur oder ein anderes verwaltetes Datenbankobjekt erstellen, müssen bestimmte Codeüberprüfungen von SQL Server berücksichtigt werden. SQL Server führt Überprüfungen für die verwaltete Codeassembly durch, wenn sie zum ersten Mal in der Datenbank registriert wird, mithilfe der CREATE ASSEMBLY-Anweisung und auch zur Laufzeit. Der verwaltete Code wird außerdem zur Laufzeit überprüft, da in einer Assembly Codepfade vorhanden sein können, die zur Laufzeit eigentlich nicht erreicht werden. Dadurch wird Flexibilität für die Registrierung von Assemblys von Drittanbietern geschaffen, sodass eine Assembly nicht blockiert wird, wenn ein "Unsafe"-Code vorliegt, der in einer Clientumgebung ausgeführt werden soll, jedoch nie in der gehosteten CLR ausgeführt wird. Die Anforderungen, die der verwaltete Code erfüllen muss, hängen davon ab, ob die Assembly als SAFE, EXTERNAL_ACCESS oder UNSAFE registriert ist, wobei SAFE die strengste ist, und werden unten aufgeführt.

Neben den Einschränkungen, die für verwaltete Codeassemblys gelten, werden außerdem Sicherheitsberechtigungen für Code erteilt. Die CLR (Common Language Runtime) unterstützt ein Sicherheitsmodell, das als Codezugriffssicherheit für verwalteten Code bezeichnet wird. In diesem Modell werden Assemblys Berechtigungen auf Grundlage der Identität des Codes gewährt. SAFE-, EXTERNAL_ACCESS- und UNSAFE-Assemblys verfügen über unterschiedliche CAS-Berechtigungen. Weitere Informationen finden Sie unter ClR Integration Code Access Security.

CREATE ASSEMBLY-Überprüfungen

Wenn die CREATE ASSEMBLY-Anweisung ausgeführt wird, werden die folgenden Überprüfungen für jede Sicherheitsstufe ausgeführt. Wenn eine Überprüfung fehlschlägt, schlägt CREATE ASSEMBLY mit einer Fehlermeldung fehl.

Global (eine beliebige Sicherheitsebene)

Alle Assemblys, auf die verwiesen wird, müssen ein oder mehrere der folgenden Kriterien erfüllen:

  • Die Assembly ist bereits in der Datenbank registriert.

  • Die Assembly ist eine der unterstützten Assemblys. Weitere Informationen finden Sie unter Unterstützte .NET Framework-Bibliotheken.

  • Sie verwenden CREATE ASSEMBLY FROM<location>, und alle Assemblys, auf die verwiesen wird, und deren Abhängigkeiten sind am< Speicherort> verfügbar.

  • Sie verwenden CREATE ASSEMBLY FROM<Bytes ...> und alle Verweise werden durch leerzeichentrennte Bytes angegeben.

EXTERNAL_ACCESS

Alle EXTERNAL_ACCESS-Assemblys müssen die folgenden Kriterien erfüllen:

  • Statische Felder werden nicht verwendet, um Informationen zu speichern. Schreibgeschützte statische Felder sind zulässig.

  • Der PEVerify-Test wird bestanden. Das PEVerify-Tool (peverify.exe), das überprüft, ob der MSIL-Code und die zugeordneten Metadaten den Anforderungen an die Typsicherheit entsprechen, wird mit .NET Framework SDK zur Verfügung gestellt.

  • Die Synchronisierung, z. B. mit der SynchronizationAttribute-Klasse , wird nicht verwendet.

  • Finalizer-Methoden werden nicht verwendet.

Die folgenden benutzerdefinierten Attribute sind in EXTERNAL_ACCESS Assemblys nicht zulässig:

  • 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

  • Alle EXTERNAL_ACCESS Assemblybedingungen werden überprüft.

Laufzeitüberprüfungen

Zur Laufzeit wird die Codeassembly auf die folgenden Bedingungen überprüft. Wird eine dieser Bedingungen erkannt, darf der verwaltete Code nicht ausgeführt werden und es wird eine Ausnahme ausgelöst.

UNSAFE

Das Explizite Laden einer Assembly durch Aufrufen der System.Reflection.Assembly.Load() -Methode aus einem Bytearray oder implizit durch verwendung des Reflection.Emit-Namespaces ist nicht zulässig.

EXTERNAL_ACCESS

Alle UNSAFE-Bedingungen werden überprüft.

Alle Typen und Methoden, die mit den folgenden Hostschutzattributwerten in der unterstützten Assemblyliste als Anmerkungen versehen sind, sind nicht zulässig.

  • SelfAffectingProcessMgmt

  • SelfAffectingThreading

  • Synchronization

  • SharedState

  • ExternalProcessMgmt

  • ExternalThreading

  • SecurityInfrastructure

  • MayLeakOnAbort

  • Benutzeroberfläche

Weitere Informationen zu HPAs und einer Liste nicht zulässiger Typen und Member in den unterstützten Assemblys finden Sie unter Host Protection Attributes and CLR Integration Programming.

SAFE

Alle EXTERNAL_ACCESS Bedingungen werden überprüft.

Weitere Informationen

Unterstützte .NET Framework-Bibliotheken
CLR-Integration und Codezugriffssicherheit
Hostschutzattribute und Programmierung der CLR-Integration
Erstellen von Assemblys