Freigeben über


Einschränkungen des CLR-Integrationsprogrammiermodells

Gilt für: SQL Server Azure SQL Managed Instance

Wenn Sie eine verwaltete gespeicherte Prozedur oder ein anderes verwaltetes Datenbankobjekt erstellen, führt SQL Server bestimmte Codeprüfungen aus, die berücksichtigt werden müssen. Diese Prüfungen werden bei der ersten Registrierung in der Datenbank, mithilfe der CREATE ASSEMBLY Anweisung und auch zur Laufzeit für die Assembly mit verwaltetem Code ausgeführt. Der verwaltete Code wird auch zur Laufzeit überprüft, da in einer Assembly möglicherweise Codepfade vorhanden sind, die möglicherweise nie zur Laufzeit erreicht werden.

Diese Codeüberprüfungen bieten Flexibilität beim Registrieren von Assemblys von Drittanbietern insbesondere, sodass eine Assembly nicht blockiert wird, wenn unsicherer Code für die Ausführung in einer Clientumgebung vorgesehen ist, aber niemals in der gehosteten Common Language Runtime (CLR) ausgeführt wird. Die Anforderungen, die der verwaltete Code erfüllen muss, hängen davon ab, ob die Assembly als SAFE, oder EXTERNAL_ACCESSUNSAFE. SAFE ist die strengste Sicherheitsstufe.

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

Wenn die Herausgeberrichtlinie festgelegt ist, CREATE ASSEMBLY schlägt ein Fehler fehl.

ERSTELLEN VON ASSEMBLYprüfungen

Wenn die CREATE ASSEMBLY Anweisung ausgeführt wird, werden die folgenden Prüfungen für jede Sicherheitsstufe ausgeführt. Wenn eine Überprüfung fehlschlägt, CREATE ASSEMBLY schlägt die 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 referenzierten Assemblys und deren Abhängigkeiten sind verfügbar in <location>.

  • Sie verwenden CREATE ASSEMBLY FROM <bytes ...>, und alle Verweise werden über leerzeichentrennte Bytes angegeben.

EXTERNAL_ACCESS

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

  • Statische Felder werden nicht zum Speichern von Informationen verwendet. Schreibgeschützte statische Felder sind zulässig.

  • Der PEVerify-Test wird bestanden. Das PEVerify-Tool (peverify.exe), mit dem überprüft wird, ob der Code für die allgemeine Zwischensprache (CIL) und die zugehörigen Metadaten den Typsicherheitsanforderungen entsprechen, wird mit dem .NET Framework SDK bereitgestellt.

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

  • Finalizermethoden 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. Wenn eine dieser Bedingungen gefunden wird, darf der verwaltete Code nicht ausgeführt werden, und eine Ausnahme wird ausgelöst.

UNSAFE

Sie können eine Assembly nicht explizit laden, indem Sie die System.Reflection.Assembly.Load() Methode aus einem Bytearray aufrufen oder implizit den Namespace verwenden Reflection.Emit .

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
  • UI

Weitere Informationen zu HPAs und einer Liste der unzulässigen 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.