Assembly's ontwerpen
van toepassing op:SQL Server-
In dit artikel worden de volgende factoren beschreven die u moet overwegen wanneer u assembly's ontwerpt:
- Verpakkingsassembly's
- Assemblybeveiliging beheren
- Beperkingen voor assembly's
Pakketassembly's
Een assembly kan functionaliteit bevatten voor meer dan één SQL Server-routine of type in de klassen en methoden. Meestal is het zinvol om de functionaliteit van routines die gerelateerde functies in dezelfde assembly uitvoeren, te verpakken, vooral als deze routines klassen delen waarvan de methoden elkaar aanroepen. Klassen die bijvoorbeeld beheertaken voor gegevensinvoer uitvoeren voor CLR-triggers (Common Language Runtime) en CLR-opgeslagen procedures kunnen in dezelfde assembly worden verpakt. Dit komt doordat de methoden voor deze klassen elkaar waarschijnlijker zullen aanroepen dan methoden van minder gerelateerde taken.
Wanneer u code in de assembly verpakt, kunt u het volgende overwegen:
Door de gebruiker gedefinieerde CLR-typen en -indexen die afhankelijk zijn van door de gebruiker gedefinieerde CLR-functies, kunnen ervoor zorgen dat persistente gegevens zich in de database bevinden die afhankelijk zijn van de assembly. Het wijzigen van de code van een assembly is vaak complexer wanneer er persistente gegevens zijn die afhankelijk zijn van de assembly in de database. Daarom is het beter om code te scheiden waarop persistente gegevensafhankelijkheden afhankelijk zijn (zoals door de gebruiker gedefinieerde typen en indexen met behulp van door de gebruiker gedefinieerde functies) van code die deze persistente gegevensafhankelijkheden niet heeft. Zie Assembly's implementeren en ALTER ASSEMBLYvoor meer informatie.
Als een stukje beheerde code een hogere machtiging vereist, is het beter om die code te scheiden in een afzonderlijke assembly van code waarvoor geen hogere machtiging is vereist.
Assemblybeveiliging beheren
U kunt bepalen hoeveel een assembly toegang heeft tot resources die worden beveiligd door .NET Code Access Security wanneer deze beheerde code uitvoert. U doet dit door een van de drie machtigingensets op te geven wanneer u een assembly maakt of wijzigt: SAFE
, EXTERNAL_ACCESS
of UNSAFE
.
VEILIGE machtiging
SAFE
is de standaardmachtigingsset en het is de meest beperkende. Code die wordt uitgevoerd door een assembly met SAFE
machtigingen heeft geen toegang tot externe systeembronnen, zoals bestanden, het netwerk, omgevingsvariabelen of het register.
SAFE
code heeft toegang tot gegevens uit de lokale SQL Server-databases of voert u berekeningen en bedrijfslogica uit die geen toegang hebben tot resources buiten de lokale databases.
De meeste assembly's voeren berekenings- en gegevensbeheertaken uit zonder toegang te hebben tot resources buiten SQL Server. Daarom raden we SAFE
aan als de assemblymachtigingsset.
EXTERNAL_ACCESS machtiging
EXTERNAL_ACCESS
stelt assembly's in staat om toegang te krijgen tot bepaalde externe systeembronnen, zoals bestanden, netwerken, webservices, omgevingsvariabelen en het register. Alleen SQL Server-aanmeldingen met EXTERNAL ACCESS
machtigingen kunnen EXTERNAL_ACCESS
assembly's maken.
SAFE en EXTERNAL_ACCESS
assembly's kunnen alleen code bevatten die verifieerbaar type-veilig is. Dit betekent dat deze assembly's alleen toegang hebben tot klassen via goed gedefinieerde toegangspunten die geldig zijn voor de typedefinitie. Daarom kunnen ze geen willekeurige toegang krijgen tot geheugenbuffers die niet eigendom zijn van de code. Daarnaast kunnen ze geen bewerkingen uitvoeren die mogelijk een nadelig effect hebben op de robuustheid van het SQL Server-proces.
ONVEILIGE machtiging
UNSAFE
biedt assembly's onbeperkte toegang tot resources, zowel binnen als buiten SQL Server. Code die vanuit een UNSAFE
assembly wordt uitgevoerd, kan onbeheerde code aanroepen.
Als u UNSAFE
opgeeft, kan de code in de assembly bewerkingen uitvoeren die als type onveilig worden beschouwd door de CLR-verifier. Deze bewerkingen hebben mogelijk op een onbeheerde manier toegang tot geheugenbuffers in de SQL Server-procesruimte.
UNSAFE
assembly's kunnen het beveiligingssysteem van SQL Server of de algemene taalruntime ook onderbouwen.
UNSAFE
machtigingen mogen alleen worden verleend aan zeer vertrouwde assembly's door ervaren ontwikkelaars of beheerders. Alleen leden van de sysadmin vaste serverfunctie kunnen UNSAFE
assembly's maken.
Beperkingen voor assembly's
SQL Server plaatst bepaalde beperkingen voor beheerde code in assembly's om ervoor te zorgen dat ze op een betrouwbare en schaalbare manier kunnen worden uitgevoerd. Dit betekent dat bepaalde bewerkingen die de robuustheid van de server kunnen misbruiken, niet zijn toegestaan in SAFE
en EXTERNAL_ACCESS
assembly's.
Niet-toegestane aangepaste kenmerken
Assembly's kunnen niet worden geannoteerd met de volgende aangepaste kenmerken:
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.STAThreadAttribute
System.ThreadStaticAttribute
Daarnaast kunnen SAFE
en EXTERNAL_ACCESS
assembly's niet worden geannoteerd met de volgende aangepaste kenmerken:
System.Security.SuppressUnmanagedCodeSecurityAttribute
System.Security.UnverifiableCodeAttribute
Niet-toegestane .NET Framework-API's
Een .NET Framework-API die is geannoteerd met een van de niet-toegestane HostProtectionAttributes
kan niet worden aangeroepen vanuit SAFE
en EXTERNAL_ACCESS
assembly's.
HostProtectionAttribute.SelfAffectingProcessMgmt
HostProtectionAttribute.SelfAffectingThreading
HostProtectionAttribute.Synchronization
HostProtectionAttribute.SharedState
HostProtectionAttribute.ExternalProcessMgmt
HostProtectionAttribute.ExternalThreading
HostProtectionAttribute.SecurityInfrastructure
HostProtectionAttribute.MayLeakOnAbort
HostProtectionAttribute.UI
Ondersteunde .NET Framework-assembly's
Elke assembly waarnaar wordt verwezen door uw aangepaste assembly, moet worden geladen in SQL Server met behulp van CREATE ASSEMBLY
. De volgende .NET Framework-assembly's zijn al geladen in SQL Server en kunnen daarom worden verwezen door aangepaste assembly's zonder dat u CREATE ASSEMBLY
hoeft te gebruiken.
mscorlib.dll
CustomMarshalers.dll
Microsoft.VisualBasic.dll
Microsoft.VisualC.dll
System.Configuration.dll
System.Core.dll
System.Data.OracleClient.dll
System.Data.SqlXml.dll
System.Data.dll
System.Deployment.dll
System.Security.dll
System.Transactions.dll
System.Web.Services.dll
System.Xml.Linq.dll
system.Xml.dll
System.dll