Sdílet prostřednictvím


Vytvoření sestavení

platí pro:SQL Server

Spravované databázové objekty, jako jsou uložené procedury nebo triggery, se kompilují a pak nasazují v jednotkách označovaných jako sestavení. Spravovaná sestavení DLL musí být zaregistrována na SQL Serveru, aby bylo možné použít funkce, které sestavení poskytuje. K registraci sestavení v databázi SQL Serveru použijte příkaz CREATE ASSEMBLY. Tento článek popisuje, jak zaregistrovat sestavení v databázi pomocí příkazu CREATE ASSEMBLY a jak určit nastavení zabezpečení pro sestavení.

Příkaz CREATE ASSEMBLY

Příkaz CREATE ASSEMBLY slouží k vytvoření sestavení v databázi. Tady je příklad:

CREATE ASSEMBLY SQLCLRTest
    FROM 'C:\MyDBApp\SQLCLRTest.dll';

Klauzule FROM určuje název cesty sestavení k vytvoření. Tato cesta může být buď cesta UNC (Universal Naming Convention), nebo fyzická cesta k souboru, která je místní pro počítač.

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

Je možné vytvořit sestavení, která odkazují na jiná sestavení. Při vytváření sestavení v SYSTÉMU SQL Server vytvoří SQL Server také sestavení odkazovaná sestavením na kořenové úrovni, pokud odkazovaná sestavení ještě nejsou vytvořena do databáze.

Uživatelům databáze nebo uživatelským rolím se přidělují oprávnění k vytváření, a proto vlastní sestavení v databázi. Aby bylo možné vytvářet sestavení, měl by mít uživatel nebo role databáze oprávnění CREATE ASSEMBLY.

Sestavení může být úspěšné pouze při odkazování na jiná sestavení, pokud:

  • Sestavení, které je voláno nebo odkazováno, vlastní stejný uživatel nebo role.
  • Sestavení, které je volána nebo odkazováno, bylo vytvořeno ve stejné databázi.

Určení zabezpečení při vytváření sestavení

Při vytváření sestavení do databáze SQL Serveru můžete zadat jednu ze tří různých úrovní zabezpečení, ve kterých může kód běžet: SAFE, EXTERNAL_ACCESSnebo UNSAFE. Při spuštění příkazu CREATE ASSEMBLY se na sestavení kódu provádějí určité kontroly, což může způsobit selhání registrace sestavení na serveru.

SAFE je výchozí sada oprávnění a ve většině scénářů funguje. Pokud chcete zadat danou úroveň zabezpečení, upravíte syntaxi příkazu CREATE ASSEMBLY následujícím způsobem:

CREATE ASSEMBLY SQLCLRTest
    FROM 'C:\MyDBApp\SQLCLRTest.dll'
    WITH PERMISSION_SET = SAFE;

Je také možné vytvořit sestavení s oprávněním SAFE nastaveným vynecháním třetího řádku předchozího řádku.

CREATE ASSEMBLY SQLCLRTest
    FROM 'C:\MyDBApp\SQLCLRTest.dll';

Když se kód v sestavení spustí v sadě oprávnění SAFE, může provádět pouze výpočty a přístup k datům v rámci serveru prostřednictvím zprostředkovatele spravovaného v procesu.

Vytváření EXTERNAL_ACCESS a nebezpečných sestavení

EXTERNAL_ACCESS řeší scénáře, ve kterých kód potřebuje přístup k prostředkům mimo server, jako jsou soubory, síť, registr a proměnné prostředí. Pokaždé, když server přistupuje k externímu prostředku, zosobní kontext zabezpečení uživatele, který volá spravovaný kód.

UNSAFE oprávnění kódu je pro takové situace, kdy sestavení není ověřitelně bezpečné nebo vyžaduje další přístup k omezeným prostředkům, jako je rozhraní API Win32.

Chcete-li vytvořit EXTERNAL_ACCESS nebo UNSAFE sestavení v SQL Serveru, musí být splněna jedna z následujících dvou podmínek:

  1. Sestavení je silným názvem podepsaným nebo podpisem authenticode pomocí certifikátu. Tento silný název (nebo certifikát) se vytvoří uvnitř SQL Serveru jako asymetrický klíč (nebo certifikát) a má odpovídající přihlášení s oprávněním EXTERNAL ACCESS ASSEMBLY (pro sestavení externího přístupu) nebo UNSAFE ASSEMBLY oprávnění (pro nebezpečná sestavení).

  2. Vlastník databáze (DBO) má oprávnění EXTERNAL ACCESS ASSEMBLY (pro sestavení EXTERNAL ACCESS) nebo UNSAFE ASSEMBLY (pro sestavení UNSAFE) a databáze má vlastnost databáze TRUSTWORTHY nastavena na ON.

Tyto dvě podmínky uvedené dříve jsou také kontrolovány při načítání sestavení (včetně provádění). Aby bylo možné načíst sestavení, musí být splněna alespoň jedna z podmínek.

Doporučujeme, aby vlastnost databáze TRUSTWORTHY v databázi nebyla nastavená na ON pouze pro spuštění kódu CLR (Common Language Runtime) v procesu serveru. Místo toho doporučujeme vytvořit asymetrický klíč ze souboru sestavení v databázi master. Přihlašovací jméno namapované na tento asymetrický klíč se pak musí vytvořit a přihlášení musí být uděleno EXTERNAL ACCESS ASSEMBLY nebo UNSAFE ASSEMBLY oprávnění.

Následující příkazy Transact-SQL provádějí kroky potřebné k vytvoření asymetrického klíče, namapování přihlášení k tomuto klíči a udělení EXTERNAL_ACCESS oprávnění k přihlášení. Před spuštěním příkazu CREATE ASSEMBLY je nutné spustit následující příkazy Transact-SQL.

USE master;
GO

CREATE ASYMMETRIC KEY SQLCLRTestKey
     FROM EXECUTABLE FILE = 'C:\MyDBApp\SQLCLRTest.dll';

CREATE LOGIN SQLCLRTestLogin
    FROM ASYMMETRIC KEY SQLCLRTestKey;

GRANT EXTERNAL ACCESS ASSEMBLY TO SQLCLRTestLogin;
GO

Poznámka

Musíte vytvořit nové přihlášení, které se přidruží k asymetrickému klíči. Toto přihlášení slouží pouze k udělení oprávnění. Není nutné ho přidružit k uživateli ani ho použít v rámci aplikace.

Aby bylo možné vytvořit EXTERNAL ACCESS sestavení, musí tvůrce při vytváření sestavení zadat oprávnění EXTERNAL ACCESS:

CREATE ASSEMBLY SQLCLRTest
    FROM 'C:\MyDBApp\SQLCLRTest.dll'
    WITH PERMISSION_SET = EXTERNAL_ACCESS;

Následující příkazy Transact-SQL provádějí kroky potřebné k vytvoření asymetrického klíče, namapování přihlášení k tomuto klíči a udělení UNSAFE oprávnění k přihlášení. Před spuštěním příkazu CREATE ASSEMBLY je nutné spustit následující příkazy Transact-SQL.

USE master;
GO

CREATE ASYMMETRIC KEY SQLCLRTestKey
     FROM EXECUTABLE FILE = 'C:\MyDBApp\SQLCLRTest.dll';

CREATE LOGIN SQLCLRTestLogin
    FROM ASYMMETRIC KEY SQLCLRTestKey;

GRANT UNSAFE ASSEMBLY TO SQLCLRTestLogin;
GO

Chcete-li určit, že sestavení se načte s oprávněním UNSAFE, zadáte UNSAFE oprávnění nastavená při načítání sestavení na server:

CREATE ASSEMBLY SQLCLRTest
    FROM 'C:\MyDBApp\SQLCLRTest.dll'
    WITH PERMISSION_SET = UNSAFE;

Další informace o oprávněních pro každé nastavení naleznete v tématu zabezpečení integrace CLR.