Sdílet prostřednictvím


CREATE ASSEMBLY (Transact-SQL)

Applies to:SQL ServerAzure SQL Managed Instance

Vytvoří modul spravované aplikace, který obsahuje metadata třídy a spravovaný kód jako objekt v instanci SQL Serveru. Odkazem na tento modul lze v databázi vytvořit funkce modulu CLR (Common Language Runtime), uložené procedury, triggery, agregace definované uživatelem a uživatelem definované typy.

Transact-SQL konvence syntaxe

Syntax

CREATE ASSEMBLY assembly_name
[ AUTHORIZATION owner_name ]
FROM { <client_assembly_specifier> | <assembly_bits> [ , ...n ] }
[ WITH PERMISSION_SET = { SAFE | EXTERNAL_ACCESS | UNSAFE } ]
[ ; ]
<client_assembly_specifier> ::=
    '[ \\computer_name\ ] share_name\ [ path\ ] manifest_file_name'
    | '[ local_path\ ] manifest_file_name'

<assembly_bits> ::=
{ varbinary_literal | varbinary_expression }

Arguments

assembly_name

Název sestavení. The name must be unique within the database and a valid identifier.

AUTHORIZATION owner_name

Určuje jméno uživatele nebo role jako vlastníka sestavení. owner_name must either be the name of a role of which the current user is a member, or the current user must have IMPERSONATE permission on owner_name. Pokud není zadáno, je vlastnictví uděleno aktuálnímu uživateli.

<client_assembly_specifier>

Určuje místní cestu nebo síťové umístění, kde se nachází nahrané sestavení, a také název souboru manifestu, který odpovídá sestavení. <client_assembly_specifier> lze vyjádřit jako pevný řetězec nebo výraz, který se vyhodnocuje s pevným řetězcem s proměnnými. CREATE ASSEMBLY nepodporuje načítání vícemodulových sestavení. SQL Server také vyhledá všechna závislá sestavení tohoto sestavení ve stejném umístění a také je nahraje se stejným vlastníkem jako sestavení kořenové úrovně. Pokud tato závislá sestavení nejsou nalezena a nejsou již načtena v aktuální databázi, CREATE ASSEMBLY selže. Pokud jsou závislá sestavení již načtena v aktuální databázi, vlastník těchto sestavení musí být stejný jako vlastník nově vytvořeného sestavení.

Important

Azure SQL Database a Azure SQL Managed Instance nepodporují vytváření sestavení ze souboru.

<client_assembly_specifier> nelze zadat, pokud se přihlášený uživatel zosobní.

<assembly_bits>

Seznam binárních hodnot, které tvoří sestavení a jeho závislá sestavení. První hodnota v seznamu je považována za sestavení na kořenové úrovni. Hodnoty odpovídající závislým sestavením lze zadat v libovolném pořadí. Všechny hodnoty, které neodpovídají závislostem kořenového sestavení, se ignorují.

Note

Tato možnost není dostupná v databázi s omezením.

varbinary_literal

A varbinary literal.

varbinary_expression

An expression of type varbinary.

PERMISSION_SET { SAFE | EXTERNAL_ACCESS | NEBEZPEČNÉ }

Určuje sadu přístupových oprávnění kódu, která jsou udělena sestavení při přístupu k SQL Serveru. Pokud není zadáno, SAFE použije se jako výchozí.

Tato PERMISSION_SET možnost má vliv na konfiguraci serveru: clr strict security option. Pokud clr strict security je povoleno, jsou všechna sestavení považována za UNSAFE.

Doporučujeme používat SAFE. SAFE je nejvíce omezující sada oprávnění. 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.

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ě, proměnné prostředí a registr.

UNSAFE umožňuje sestavením neomezený přístup k prostředkům, a to jak uvnitř, tak mimo instanci SQL Serveru. Kód spuštěný z sestavení UNSAFE může volat nespravovaný kód.

SAFE je doporučené nastavení oprávnění pro sestavení, která provádějí úlohy výpočtu a správy dat bez přístupu k prostředkům mimo instanci SQL Serveru.

Note

V EXTERNAL_ACCESS databázi s omezením nejsou dostupné možnosti a UNSAFE možnosti.

Doporučujeme použít EXTERNAL_ACCESS pro sestavení, která přistupují k prostředkům mimo instanci SQL Serveru. EXTERNAL_ACCESS sestavení zahrnují ochranu SAFE spolehlivosti a škálovatelnosti sestavení, ale z hlediska zabezpečení jsou podobná UNSAFE sestavením. Kód v EXTERNAL_ACCESS sestaveních běží ve výchozím nastavení pod účtem služby SQL Serveru a přistupuje k externím prostředkům v rámci tohoto účtu, pokud kód explicitně nezosobňuje volajícího. Oprávnění k vytváření EXTERNAL_ACCESS sestavení by proto mělo být uděleno pouze pro přihlášení, která jsou důvěryhodná ke spuštění kódu v rámci účtu služby SQL Server. Další informace o zosobnění najdete v tématu Zabezpečení integrace CLR.

Určení UNSAFE umožňuje kódu v sestavení úplnou svobodu provádět operace v prostoru procesu SQL Serveru, který může potenciálně ohrozit odolnost SQL Serveru. 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. Only members of the sysadmin fixed server role can create and alter UNSAFE assemblies.

For more information about assembly permission sets, see Design assemblies.

Zabezpečení přístupu kódu se už nepodporuje.

CLR používá zabezpečení přístupu kódu (CAS) v rozhraní .NET Framework, které se už nepodporuje jako hranice zabezpečení. Sestavení CLR vytvořené s PERMISSION_SET = SAFE může mít přístup k externím systémovým prostředkům, volat nespravovaný kód a získat oprávnění správce systému. V SQL Serveru 2017 (14.x) a novějších verzích, možnost sp_configure, přísné zabezpečení CLR, vylepšuje zabezpečení sestavení CLR. clr strict security je ve výchozím nastavení povolen a se sestaveními SAFE a EXTERNAL_ACCESS zachází, jako by byla označena UNSAFE. Možnost clr strict security může být zakázaná kvůli zpětné kompatibilitě, ale nedoporučuje se.

Doporučujeme podepsat všechna sestavení certifikátem nebo asymetrickým klíčem s odpovídajícím přihlašovacím jménem, kterému bylo uděleno oprávnění UNSAFE ASSEMBLY v databázi master. Správci SQL Serveru mohou také přidat sestavení do seznamu sestavení, kterým má databázový stroj důvěřovat. For more information, see sys.sp_add_trusted_assembly.

Remarks

CREATE ASSEMBLY nahraje sestavení, které bylo dříve zkompilováno jako soubor .dll ze spravovaného kódu pro použití v instanci SQL Serveru.

Pokud je tato možnost povolená, PERMISSION_SET možnost v CREATE ASSEMBLY příkazech a ALTER ASSEMBLY příkazech se ignoruje za běhu, ale PERMISSION_SET možnosti se zachovají v metadatech. Ignorování této možnosti minimalizuje přerušení existujících příkazů kódu.

SQL Server neumožňuje registraci různých verzí sestavení se stejným názvem, jazykovou verzí a veřejným klíčem.

Při pokusu o přístup k sestavení zadanému v <client_assembly_specifier>aplikaci SQL Server zosobní kontext zabezpečení aktuálního přihlášení systému Windows. Pokud <client_assembly_specifier> určuje síťové umístění (cesta UNC), zosobnění aktuálního přihlášení se nepřenese do síťového umístění kvůli omezením delegování. V tomto případě se přístup provádí pomocí kontextu zabezpečení účtu služby SQL Serveru. Další informace najdete v tématupřihlašovací údaje (databázový stroj).

Besides the root assembly specified by assembly_name, SQL Server tries to upload any assemblies that are referenced by the root assembly being uploaded. Pokud je odkazované sestavení již odesláno do databáze z důvodu dřívějšího CREATE ASSEMBLY příkazu, toto sestavení není odesláno, ale je k dispozici kořenovému sestavení. Pokud závislé sestavení nebylo dříve odesláno, ale SQL Server nemůže najít soubor manifestu ve zdrojovém adresáři, CREATE ASSEMBLY vrátí chybu.

Pokud některá závislá sestavení odkazovaná kořenovým sestavením ještě nejsou v databázi a implicitně načtena společně s kořenovým sestavením, mají stejná oprávnění nastavená jako sestavení kořenové úrovně. Pokud závislá sestavení musí být vytvořena pomocí jiné sady oprávnění než sestavení kořenové úrovně, musí být odeslána explicitně před sestavením kořenové úrovně s příslušnou sadou oprávnění.

Assembly Validation

SQL Server prohledá binární soubory sestavení nahrané příkazem CREATE ASSEMBLY , aby se zajistily následující kontroly:

  • Binární soubor sestavení je dobře vytvořený s platnými metadaty a segmenty kódu a segmenty kódu mají platné pokyny jazyka MSIL (Microsoft Intermediate Language).

  • Sada systémových sestavení, která odkazuje, je jedním z následujících podporovaných sestavení v SYSTÉMU SQL Server: Microsoft.VisualBasic.dll, mscorlib.dll, System.Data.dll, System.dll, , System.Xml.dll, , System.Security.dllSystem.Web.Services.dllCustomMarshallers.dllSystem.Data.SqlXml.dllMicrosoft.VisualC.dllSystem.Core.dll, a .System.Xml.Linq.dll Na jiná systémová sestavení lze odkazovat, ale musí být explicitně zaregistrována v databázi.

  • Pro sestavení vytvořená pomocí SAFE sady oprávnění nebo EXTERNAL ACCESS sady oprávnění:

    • Kód sestavení by měl být bezpečný pro typ. Bezpečnost typů je stanovena spuštěním ověřovatele modulu CLR (Common Language Runtime) pro sestavení.

    • Sestavení by nemělo obsahovat žádné statické datové členy ve svých třídách, pokud nejsou označené jako jen pro čtení.

    • Třídy v sestavení nemohou obsahovat finalizační metody.

    • Třídy nebo metody sestavení by měly být opatřeny poznámkami pouze s povolenými atributy kódu. Další informace naleznete v tématu Integrace CLR: vlastní atributy pro rutiny CLR.

Kromě předchozích kontrol, které se provádějí při CREATE ASSEMBLY spuštění, existují další kontroly, které se provádějí v době provádění kódu v sestavení:

  • Volání určitých rozhraní API rozhraní .NET Framework, která vyžadují konkrétní oprávnění pro přístup ke kódu, může selhat, pokud sada oprávnění sestavení neobsahuje toto oprávnění.

  • U SAFE sestavení a EXTERNAL_ACCESS sestavení se nezdaří všechny pokusy o volání rozhraní API rozhraní .NET Framework, která jsou opatřena poznámkami s určitými objekty HostProtectionAttributes.

For more information, see Design assemblies.

Permissions

Vyžaduje oprávnění CREATE ASSEMBLY.

Pokud PERMISSION_SET = EXTERNAL_ACCESS je zadáno, vyžaduje EXTERNAL ACCESS ASSEMBLY oprávnění na serveru. Pokud PERMISSION_SET = UNSAFE je zadáno, vyžaduje UNSAFE ASSEMBLY oprávnění na serveru.

Uživatel musí být vlastníkem všech sestavení odkazovaných sestavením, která mají být odeslána, pokud sestavení již v databázi existují. To upload an assembly by using a file path, the current user must be a Windows authenticated login or a member of the sysadmin fixed server role. Přihlašovací jméno uživatele, který se spustí CREATE ASSEMBLY , musí mít oprávnění ke čtení sdílené složky a soubory, které se načítají v příkazu.

Oprávnění s přísným zabezpečením CLR

Následující oprávnění požadovaná k vytvoření sestavení CLR, pokud CLR strict security je povoleno:

  • Uživatel musí mít CREATE ASSEMBLY oprávnění.
  • A jedna z následujících podmínek musí být také pravdivá:
    • Sestavení je podepsáno certifikátem nebo asymetrickým klíčem, který má odpovídající přihlášení s oprávněním UNSAFE ASSEMBLY na serveru. Doporučuje se podepsání sestavení.
    • Databáze má vlastnost TRUSTWORTHY nastavenou na ONa databáze je vlastněna přihlášením, které má oprávnění UNSAFE ASSEMBLY na serveru. Tato možnost se nedoporučuje.

For more information about assembly permission sets, see Design assemblies.

Examples

A. Vytvoření sestavení z knihovny DLL

Následující příklad předpokládá, že ukázky databázového stroje SQL Serveru jsou nainstalovány ve výchozím umístění místního počítače a HelloWorld.csproj ukázková aplikace je zkompilována. Další informace najdete v tématu Hello World Sample.

CREATE ASSEMBLY HelloWorld
FROM '<system_drive>:\Program Files\Microsoft SQL Server\100\Samples\HelloWorld\CS\HelloWorld\bin\debug\HelloWorld.dll'
WITH PERMISSION_SET = SAFE;

Important

Azure SQL Database nepodporuje vytvoření sestavení ze souboru.

B. Vytvoření sestavení z bitů sestavení

Nahraďte ukázkové bity (které nejsou úplné nebo platné) bity sestavení.

CREATE ASSEMBLY HelloWorld
    FROM 0x4D5A900000000000
WITH PERMISSION_SET = SAFE;