Dela via


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_ACCESSeller 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:

  1. 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) eller UNSAFE ASSEMBLY behörighet (för osäkra sammansättningar).

  2. Databasägaren (DBO) har EXTERNAL ACCESS ASSEMBLY (för EXTERNAL ACCESS sammansättningar) eller UNSAFE ASSEMBLY (för UNSAFE 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.