Utilizzo di assembly verificabili con SQL Server (C++/CLI)
Le stored procedure estese, in package come librerie a collegamento dinamico (DLL), consentono di estendere le funzionalità di SQL Server attraverso funzioni sviluppate con Visual C++.Tali stored procedure sono implementate come funzioni all'interno delle DLL.Oltre alle funzioni, le stored procedure estese possono inoltre definire tipi definiti dall'utente e funzioni di aggregazione (ad esempio, SUM o AVG).
Quando si esegue una stored procedure estesa in un client, in SQL Server viene cercata e caricata la DLL associata.La stored procedure estesa richiesta viene chiamata in SQL Server ed eseguita in un contesto di sicurezza specificato.La stored procedure estesa passa quindi gruppi di risultati e restituisce parametri al server.
SQL Server 2005 fornisce a Transact-SQL (T-SQL) estensioni per consentire l'installazione di assembly verificabili in SQL Server.Il set di autorizzazioni di SQL Server specifica il contesto di sicurezza caratterizzato dai livelli riportati di seguito:
Modalità non limitata: il codice viene eseguito sotto la responsabilità dell'utente e non deve essere codice indipendente dai tipi verificabile.
Modalità sicura: viene eseguito codice indipendente dai tipi verificabile, compilato con /clr:safe.
Per la modalità sicura è necessario che gli assembly eseguiti siano verificabili come indipendenti dai tipi.
Per creare e caricare un assembly verificabile in SQL Server, utilizzare i comandi CREATE ASSEMBLY e DROP ASSEMBLY di Transact-SQL come descritto di seguito:
CREATE ASSEMBLY <assemblyName> FROM <'Assembly UNC Path'> WITH
PERMISSION_SET <permissions>
DROP ASSEMBLY <assemblyName>
Il comando PERMISSION_SET consente di specificare il contesto di sicurezza. I valori ad esso associati sono UNRESTRICTED, SAFE oppure EXTENDED.
È inoltre possibile utilizzare il comando CREATE FUNCTION per associare nomi di metodi in una classe:
CREATE FUNCTION <FunctionName>(<FunctionParams>)
RETURNS returnType
[EXTERNAL NAME <AssemblyName>:<ClassName>::<StaticMethodName>]
Esempio
Nello script SQL riportato di seguito (ad esempio, denominato "MyScript.sql") viene caricato un assembly in SQL Server e viene reso disponibile un metodo di una classe:
-- Create assembly without external access
drop assembly stockNoEA
go
create assembly stockNoEA
from
'c:\stockNoEA.dll'
with permission_set safe
-- Create function on assembly with no external access
drop function GetQuoteNoEA
go
create function GetQuoteNoEA(@sym nvarchar(10))
returns real
external name stockNoEA:StockQuotes::GetQuote
go
-- To call the function
select dbo.GetQuoteNoEA('MSFT')
go
Gli script SQL possono essere eseguiti in modo interattivo in Query Analyzer di SQL oppure nella riga di comando tramite l'utilità sqlcmd.exe.La riga di comando riportata di seguito consente di connettersi a MyServer, utilizzare il database predefinito, utilizzare una connessione trusted, creare MyScript.sql e generare il file MyResult.txt come output.
sqlcmd –S MyServer -E –i myScript.sql –o myResult.txt