Sdílet prostřednictvím


Návrh sestavení

platí pro:SQL Server

Tento článek popisuje následující faktory, které byste měli zvážit při návrhu sestavení:

  • Balení sestavení
  • Správa zabezpečení sestavení
  • Omezení sestavení

Sestavení balíčků

Sestavení může obsahovat funkce pro více než jednu rutinu SQL Serveru nebo typ ve svých třídách a metodách. Ve většině případů dává smysl zabalit funkce rutin, které provádějí související funkce ve stejném sestavení, zejména pokud tyto rutiny sdílejí třídy, jejichž metody vzájemně volají. Například třídy, které provádějí úlohy správy zadávání dat pro triggery CLR (Common Language Runtime) a uložené procedury CLR lze zabalit do stejného sestavení. Důvodem je to, že metody pro tyto třídy jsou pravděpodobnější, že se navzájem volají než metody méně souvisejících úkolů.

Při balení kódu do sestavení zvažte:

  • Uživatelem definované typy a indexy CLR, které závisí na uživatelem definovaných funkcích CLR, můžou způsobit, že trvalá data budou v databázi, která závisí na sestavení. Úprava kódu sestavení je často složitější, pokud existují trvalá data, která závisí na sestavení v databázi. Proto je lepší oddělit kód, na kterém se trvalé závislosti dat spoléhají (například uživatelem definované typy a indexy pomocí uživatelem definovaných funkcí) od kódu, který tyto trvalé závislosti dat neobsahuje. Další informace naleznete v tématu Implementace sestavení a ALTER ASSEMBLY.

  • Pokud část spravovaného kódu vyžaduje vyšší oprávnění, je lepší tento kód oddělit do samostatného sestavení od kódu, který nevyžaduje vyšší oprávnění.

Správa zabezpečení sestavení

Můžete řídit, kolik sestavení má přístup k prostředkům chráněným zabezpečením přístupu kódu .NET při spuštění spravovaného kódu. Provedete to zadáním jedné ze tří sad oprávnění při vytváření nebo úpravě sestavení: SAFE, EXTERNAL_ACCESSnebo UNSAFE.

Oprávnění SAFE

SAFE je výchozí sada oprávnění a je to nejvíce omezující. Kód spuštěný sestavením s oprávněními SAFE nemůže přistupovat k externím systémovým prostředkům, jako jsou soubory, síť, proměnné prostředí nebo registr. SAFE kód může přistupovat k datům z místních databází SQL Serveru nebo provádět výpočty a obchodní logiku, které nezahrnují přístup k prostředkům mimo místní databáze.

Většina sestavení provádí úlohy výpočtu a správy dat bez přístupu k prostředkům mimo SQL Server. Proto doporučujeme SAFE jako sadu oprávnění sestavení.

oprávnění EXTERNAL_ACCESS

EXTERNAL_ACCESS umožňuje sestavením přistupovat k určitým externím systémovým prostředkům, jako jsou soubory, sítě, webové služby, proměnné prostředí a registr. Vytvářet EXTERNAL_ACCESS sestavení můžou pouze přihlášení SQL Serveru s oprávněními EXTERNAL ACCESS.

SESTAVENÍ SAFE a EXTERNAL_ACCESS mohou obsahovat pouze kód, který je ověřitelně typově bezpečný. To znamená, že tato sestavení mají přístup pouze k třídám prostřednictvím jasně definovaných vstupních bodů, které jsou platné pro definici typu. Proto nemůžou libovolně přistupovat k vyrovnávacím pamětím paměti, které kód nevlastní. Navíc nemůžou provádět operace, které by mohly mít nepříznivý vliv na robustnost procesu SQL Serveru.

NEBEZPEČNÁ oprávnění

UNSAFE dává sestavením neomezený přístup k prostředkům, a to jak v rámci SQL Serveru, tak i mimo sql Server. Kód spuštěný z UNSAFE sestavení může volat nespravovaný kód.

Zadání UNSAFE také umožňuje kódu v sestavení provádět operace, které jsou považovány za nebezpečné typu pomocí ověřovatele CLR. Tyto operace můžou potenciálně přistupovat k vyrovnávací paměti v procesním prostoru SQL Serveru nekontrolovatelným způsobem. UNSAFE sestavení mohou také potenciálně podvrátit systém zabezpečení SQL Serveru nebo modulu CLR (Common Language Runtime). UNSAFE oprávnění by měla být udělena pouze vysoce důvěryhodným sestavením zkušeným vývojářům nebo správcům. Sestavení mohou vytvářet pouze členové role správce systému sysadmin.

Omezení sestavení

SQL Server zavádí určitá omezení spravovaného kódu v sestaveních, aby se zajistilo, že se můžou spouštět spolehlivým a škálovatelným způsobem. To znamená, že určité operace, které mohou ohrozit odolnost serveru, nejsou povoleny v SAFE a EXTERNAL_ACCESS sestavení.

Nepovolené vlastní atributy

Sestavení nemohou být opatřena poznámkami s následujícími vlastními atributy:

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

Kromě toho SAFE a EXTERNAL_ACCESS sestavení nelze anotovat následujícími vlastními atributy:

System.Security.SuppressUnmanagedCodeSecurityAttribute
System.Security.UnverifiableCodeAttribute

Nepovolené rozhraní API rozhraní .NET Framework

Z SAFE a sestavení EXTERNAL_ACCESS nelze volat jakékoli rozhraní API rozhraní .NET Framework s poznámkami s jednou z nepovolených HostProtectionAttributes.

HostProtectionAttribute.SelfAffectingProcessMgmt
HostProtectionAttribute.SelfAffectingThreading
HostProtectionAttribute.Synchronization
HostProtectionAttribute.SharedState
HostProtectionAttribute.ExternalProcessMgmt
HostProtectionAttribute.ExternalThreading
HostProtectionAttribute.SecurityInfrastructure
HostProtectionAttribute.MayLeakOnAbort
HostProtectionAttribute.UI

Podporovaná sestavení rozhraní .NET Framework

Jakékoli sestavení, na které odkazuje vaše vlastní sestavení, musí být načteno do SQL Serveru pomocí CREATE ASSEMBLY. Následující sestavení rozhraní .NET Framework jsou již načtena do SQL Serveru, a proto lze odkazovat vlastními sestaveními, aniž by bylo nutné používat CREATE ASSEMBLY.

  • 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