Skapa en sammansättning
gäller för:SQL Server
Hanterade databasobjekt, till exempel lagrade procedurer eller utlösare, kompileras och distribueras sedan i enheter som kallas sammansättning. Hanterade DLL-sammansättningar måste registreras i SQL Server innan de funktioner som sammansättningen tillhandahåller kan användas. Om du vill registrera en sammansättning i en SQL Server-databas använder du instruktionen CREATE ASSEMBLY
. I den här artikeln beskrivs hur du registrerar en sammansättning i en databas med hjälp av instruktionen CREATE ASSEMBLY
och hur du anger säkerhetsinställningarna för sammansättningen.
CREATE ASSEMBLY-instruktionen
Instruktionen CREATE ASSEMBLY
används för att skapa en sammansättning i en databas. Här är ett exempel:
CREATE ASSEMBLY SQLCLRTest
FROM 'C:\MyDBApp\SQLCLRTest.dll';
Satsen FROM
anger pathname för sammansättningen som ska skapas. Den här sökvägen kan antingen vara en UNC-sökväg (Universal Naming Convention) eller en fysisk filsökväg som är lokal för datorn.
SQL Server tillåter inte registrering av olika versioner av en sammansättning med samma namn, kultur och offentliga nyckel.
Det går att skapa sammansättningar som refererar till andra sammansättningar. När en sammansättning skapas i SQL Server skapar SQL Server även de sammansättningar som refereras av rotnivåsammansättningen, om de refererade sammansättningarna inte redan har skapats i databasen.
Databasanvändare eller användarroller ges behörighet att skapa och därför egna sammansättningar i en databas. För att kunna skapa sammansättningar bör databasanvändaren eller rollen ha behörigheten CREATE ASSEMBLY
.
En sammansättning kan bara referera till andra sammansättningar om:
- Sammansättningen som anropas eller refereras till ägs av samma användare eller roll.
- Sammansättningen som anropas eller refereras till skapades i samma databas.
Ange säkerhet när du skapar sammansättningar
När du skapar en sammansättning i en SQL Server-databas kan du ange en av tre olika säkerhetsnivåer där koden kan köras: SAFE
, EXTERNAL_ACCESS
eller UNSAFE
. När CREATE ASSEMBLY
-instruktionen körs utförs vissa kontroller på kodsammansättningen, vilket kan leda till att sammansättningen inte registreras på servern.
SAFE
är standardbehörighetsuppsättningen och fungerar för de flesta scenarier. Om du vill ange en viss säkerhetsnivå ändrar du syntaxen för CREATE ASSEMBLY
-instruktionen enligt följande:
CREATE ASSEMBLY SQLCLRTest
FROM 'C:\MyDBApp\SQLCLRTest.dll'
WITH PERMISSION_SET = SAFE;
Det går också att skapa en sammansättning med den SAFE
behörighetsuppsättningen genom att utelämna den tredje raden i föregående.
CREATE ASSEMBLY SQLCLRTest
FROM 'C:\MyDBApp\SQLCLRTest.dll';
När kod i en sammansättning körs under den SAFE
behörighetsuppsättningen kan den bara utföra beräkningen och dataåtkomsten på servern via den processhanterade providern.
Skapa EXTERNAL_ACCESS och OSÄKRA sammansättningar
EXTERNAL_ACCESS
adresserar scenarier där koden behöver komma åt resurser utanför servern, till exempel filer, nätverk, register och miljövariabler. När servern kommer åt en extern resurs personifierar den säkerhetskontexten för användaren som anropar den hanterade koden.
UNSAFE
kodbehörighet gäller för situationer där en sammansättning inte är verifierbart säker eller kräver ytterligare åtkomst till begränsade resurser, till exempel Win32-API:et.
Om du vill skapa en EXTERNAL_ACCESS
eller UNSAFE
sammansättning i SQL Server måste något av följande två villkor uppfyllas:
Sammansättningen är ett starkt namn signerat eller Authenticode signerat med ett certifikat. Det här starka namnet (eller certifikatet) skapas i SQL Server som en asymmetrisk nyckel (eller certifikat) och har en motsvarande inloggning med
EXTERNAL ACCESS ASSEMBLY
behörighet (för externa åtkomstsammansättningar) ellerUNSAFE ASSEMBLY
behörighet (för osäkra sammansättningar).Databasägaren (DBO) har
EXTERNAL ACCESS ASSEMBLY
(förEXTERNAL ACCESS
sammansättningar) ellerUNSAFE ASSEMBLY
(förUNSAFE
sammansättningar) och databasen har TRUSTWORTHY-databasegenskapen inställd påON
.
De två villkor som anges tidigare kontrolleras också vid monteringens inläsningstid (vilket inkluderar körning). Minst ett av villkoren måste uppfyllas för att kunna läsa in sammansättningen.
Vi rekommenderar att TRUSTWORTHY-databasegenskapen på en databas inte är inställd på ON
endast för att köra CLR-kod (Common Language Runtime) i serverprocessen. I stället rekommenderar vi att en asymmetrisk nyckel skapas från sammansättningsfilen i master
-databasen. En inloggning som mappas till den här asymmetriska nyckeln måste sedan skapas och inloggningen måste beviljas EXTERNAL ACCESS ASSEMBLY
eller UNSAFE ASSEMBLY
behörighet.
Följande Transact-SQL-instruktioner utför de steg som krävs för att skapa en asymmetrisk nyckel, mappa en inloggning till den här nyckeln och bevilja sedan EXTERNAL_ACCESS
behörighet till inloggningen. Du måste köra följande Transact-SQL-instruktioner innan du kör CREATE ASSEMBLY
-instruktionen.
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
Not
Du måste skapa en ny inloggning för att associera med den asymmetriska nyckeln. Den här inloggningen används endast för att bevilja behörigheter. Den behöver inte associeras med en användare eller användas i programmet.
För att skapa en EXTERNAL ACCESS
sammansättning måste skaparen ange EXTERNAL ACCESS
behörighet när sammansättningen skapas:
CREATE ASSEMBLY SQLCLRTest
FROM 'C:\MyDBApp\SQLCLRTest.dll'
WITH PERMISSION_SET = EXTERNAL_ACCESS;
Följande Transact-SQL-instruktioner utför de steg som krävs för att skapa en asymmetrisk nyckel, mappa en inloggning till den här nyckeln och bevilja sedan UNSAFE
behörighet till inloggningen. Du måste köra följande Transact-SQL-instruktioner innan du kör CREATE ASSEMBLY
-instruktionen.
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
Om du vill ange att en sammansättning läses in med UNSAFE
behörighet anger du den UNSAFE
behörighetsuppsättningen när sammansättningen läses in på servern:
CREATE ASSEMBLY SQLCLRTest
FROM 'C:\MyDBApp\SQLCLRTest.dll'
WITH PERMISSION_SET = UNSAFE;
Mer information om behörigheterna för var och en av inställningarna finns i CLR-integreringssäkerhet.