Översikt över CLR-integrering
gäller för:SQL Server
Azure SQL Managed Instance
CLR (Common Language Runtime) är kärnan i .NET Framework och tillhandahåller körningsmiljön för all .NET Framework-kod. Kod som körs inom CLR kallas hanterad kod. CLR tillhandahåller olika funktioner och tjänster som krävs för programkörning, inklusive jit-kompilering (just-in-time), allokering och hantering av minne, framtvingande av typsäkerhet, undantagshantering, trådhantering och säkerhet. Mer information finns i utvecklingsguiden för .NET Framework.
Not
Mer information om hur du använder nya .NET med SQL Server Language Extensions finns i Så här anropar du .NET-körningen i SQL Server Language Extensions.
Med CLR i SQL Server (kallas CLR-integrering) kan du skapa lagrade procedurer, utlösare, användardefinierade funktioner, användardefinierade typer och användardefinierade aggregeringar i hanterad kod. Eftersom hanterad kod kompileras till intern kod före körning kan du uppnå betydande prestandaökningar i vissa scenarier.
Kodåtkomstsäkerhet
I SQL Server 2016 (13.x) och tidigare versioner förhindrade Code Access Security (CAS) sammansättningar från att utföra vissa åtgärder.
CLR använder Code Access Security (CAS) i .NET Framework, som inte längre stöds som en säkerhetsgräns. En CLR-sammansättning som skapats med PERMISSION_SET = SAFE
kan komma åt externa systemresurser, anropa ohanterad kod och hämta sysadmin-privilegier. I SQL Server 2017 (14.x) och senare versioner förbättrar alternativet sp_configure
, strikt säkerhet, säkerheten för CLR-sammansättningar.
clr strict security
är aktiverat som standard och behandlar SAFE
och EXTERNAL_ACCESS
sammansättningar som om de hade markerats UNSAFE
. Alternativet clr strict security
kan inaktiveras för bakåtkompatibilitet, men rekommenderas inte.
Vi rekommenderar att du signerar alla sammansättningar med ett certifikat eller en asymmetrisk nyckel, med en motsvarande inloggning som har beviljats UNSAFE ASSEMBLY
behörighet i master
-databasen. SQL Server-administratörer kan också lägga till sammansättningar i en lista över sammansättningar som databasmotorn bör lita på. Mer information finns i sys.sp_add_trusted_assembly.
Fördelar med CLR-integrering
Transact-SQL är utformat för direkt dataåtkomst och manipulering i databasen. Även om Transact-SQL utmärker sig för dataåtkomst och hantering är det inte ett fullfjädrad programmeringsspråk. Till exempel stöder Transact-SQL inte matriser, samlingar, för-varje-loopar, bitväxling eller klasser. Vissa av dessa konstruktioner kan simuleras i Transact-SQL, men hanterad kod har integrerat stöd för dessa konstruktioner. Beroende på scenariot kan dessa funktioner ge en övertygande anledning att implementera vissa databasfunktioner i hanterad kod.
Visual Basic och C# erbjuder objektorienterade funktioner som inkapsling, arv och polymorfism. Relaterad kod kan nu enkelt ordnas i klasser och namnområden. När du arbetar med stora mängder serverkod kan du enkelt ordna och underhålla koden med de här funktionerna.
Hanterad kod passar bättre än Transact-SQL för beräkningar och komplicerad körningslogik, och har omfattande stöd för många komplexa uppgifter, inklusive stränghantering och reguljära uttryck. Med funktionerna i .NET Framework har du åtkomst till tusentals fördefinierade klasser och rutiner. Dessa klasser kan enkelt nås från valfri lagrad procedur, utlösare eller användardefinierad funktion. Basklassbiblioteket (BCL) innehåller klasser som tillhandahåller funktioner för strängmanipulering, avancerade matematiska åtgärder, filåtkomst, kryptografi med mera.
Not
Även om många av dessa klasser är tillgängliga för användning inifrån CLR-kod i SQL Server är de som inte är lämpliga för användning på serversidan (till exempel fönsterklasser) inte tillgängliga. Mer information finns i .NET Framework-bibliotek som stöds.
En av fördelarna med hanterad kod är typsäkerhet, eller försäkran om att kod endast kommer åt typer på väldefinierade och tillåtna sätt. Innan hanterad kod körs verifierar CLR att koden är säker. Koden kontrolleras till exempel för att säkerställa att inget minne läse som inte tidigare skrivits. CLR kan också hjälpa till att se till att koden inte manipulerar ohanterat minne.
CLR-integrering ger möjlighet till bättre prestanda. Mer information finns i Prestanda för CLR-integreringsarkitektur.
Välj mellan Transact-SQL och hanterad kod
När du skriver lagrade procedurer, utlösare och användardefinierade funktioner måste du bestämma om du vill använda traditionella Transact-SQL eller ett .NET Framework-språk som Visual Basic eller C#. Använd Transact-SQL när koden huvudsakligen utför dataåtkomst med lite eller ingen procedurlogik. Använd hanterad kod för processorintensiva funktioner och procedurer som har komplex logik, eller när du vill använda BCL för .NET Framework.
Välj mellan körning på servern och körning i klienten
En annan faktor i ditt beslut om du vill använda Transact-SQL eller hanterad kod är var du vill att koden ska finnas, serverdatorn eller klientdatorn. Både Transact-SQL och hanterad kod kan köras på servern. Detta placerar kod och data nära varandra och gör att du kan dra nytta av serverns bearbetningskraft. Å andra sidan kanske du vill undvika att placera processorintensiva uppgifter på databasservern. De flesta klientdatorer är idag kraftfulla och du kanske vill dra nytta av den här bearbetningskraften genom att placera så mycket kod som möjligt på klienten. Hanterad kod kan köras på en klientdator, medan Transact-SQL inte kan göra det.
Välj mellan utökade lagrade procedurer och hanterad kod
Utökade lagrade procedurer kan skapas för att utföra funktioner som inte är möjliga med Transact-SQL lagrade procedurer. Utökade lagrade procedurer kan dock äventyra integriteten i SQL Server-processen, medan hanterad kod som har verifierats vara typsäker inte kan göra det. Dessutom är minneshantering, schemaläggning av trådar och fibrer och synkroniseringstjänster djupare integrerade mellan den hanterade koden för CLR och SQL Server. Med CLR-integrering har du ett säkrare sätt än utökade lagrade procedurer för att skriva de lagrade procedurer som du behöver för att utföra uppgifter som inte är möjliga i Transact-SQL. Mer information om CLR-integrering och utökade lagrade procedurer finns i Prestanda för CLR-integreringsarkitektur.