Aggiunta di una stored procedure estesa a SQL Server

Nota importanteImportante

Questa caratteristica verrà rimossa a partire da una delle prossime versioni di Microsoft SQL Server. Non utilizzare questa caratteristica in un nuovo progetto di sviluppo e modificare non appena possibile le applicazioni in cui è attualmente implementata. Utilizzare invece la funzionalità di integrazione con CLR.

Una DLL che contiene funzioni di stored procedure estese funge da estensione per MicrosoftSQL Server. Per installare la DLL, copiare il file in una directory, ad esempio quella che contiene i file DLL di SQL Server (per impostazione predefinita C:\Programmi\Microsoft SQL Server\MSSQL.x\MSSQL\Binn).

Dopo che la DLL della stored procedure estesa è stata copiata nel server, un amministratore di sistema deve registrare in SQL Server ogni funzione di stored procedure estesa presente nella DLL. È possibile eseguire questa operazione utilizzando la stored procedure di sistema sp_addextendedproc.

Nota sulla protezioneNota sulla protezione

L'amministratore di sistema deve esaminare con attenzione una stored procedure estesa per assicurarsi che non contenga codice dannoso o malware prima di aggiungerla al server e prima di concedere autorizzazioni di esecuzione ad altri utenti. Verificare sempre la validità dell'input degli utenti. Non concatenare l'input dell'utente prima di convalidarlo. Non eseguire mai un comando costruito tramite input dell'utente non convalidato. Per ulteriori informazioni sulla convalida dell'input, vedere Attacco intrusivo nel codice SQL.

Il primo parametro di sp_addextendedproc specifica il nome della funzione, mentre il secondo specifica il nome della DLL nella quale risiede la funzione. È consigliabile specificare il percorso completo della DLL.

Nota importanteImportante

Le DLL esistenti non registrate con un percorso completo non funzionano dopo l'aggiornamento a SQL Server 2005. Per correggere il problema, utilizzare sp_dropextendedproc per annullare la registrazione della DLL e quindi sp_addextendedproc per registrarla di nuovo specificando il percorso completo.

Il nome della funzione specificato in sp_addextendedproc deve corrispondere esattamente a quello presente nella DLL, anche nell'uso di maiuscole e minuscole. Il comando seguente, ad esempio, registra come stored procedure estesa di SQL Server una funzione xp_hello che si trova in una dll denominata xp_hello.dll:

sp_addextendedproc 'xp_hello', 'c:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Binn\xp_hello.dll'

Se il nome della funzione specificato in sp_addextendedproc non corrisponde esattamente al nome presente nella DLL, il nuovo nome si sarà registrato in SQL Server ma il nome non sarà possibile utilizzarlo. Se ad esempio xp_Hello viene è registrato come stored procedure estesa di SQL Server che si trova in xp_hello.dll, non sarà possibile trovare la funzione nella DLL se successivamente si utilizza xp_Hello per chiamare la funzione.

--Register the function (xp_hello) with an initial upper case
sp_addextendedproc 'xp_Hello', 'c:\xp_hello.dll'

--Use the newly registered name to call the function
DECLARE @txt varchar(33)
EXEC xp_Hello @txt OUTPUT

--This is the error message
Server: Msg 17750, Level 16, State 1, Procedure xp_Hello, Line 1
Could not load the DLL xp_hello.dll, or one of the DLLs it references. Reason: 127(The specified procedure could not be found.).

Se il nome della funzione specificato in sp_addextendedproc corrisponde esattamente al nome della funzione nella DLL e per le regole di confronto dell'istanza di SQL Server non viene fatta distinzione tra maiuscole e minuscole, l'utente può chiamare la stored procedure estesa utilizzando una qualsiasi combinazione di lettere maiuscole e minuscole per il nome.

--Register the function (xp_hello)
sp_addextendedproc 'xp_hello', 'c:\xp_hello.dll'

--The following will succeed in calling xp_hello
DECLARE @txt varchar(33)
EXEC xp_Hello @txt OUTPUT

DECLARE @txt varchar(33)
EXEC xp_HelLO @txt OUTPUT

DECLARE @txt varchar(33)
EXEC xp_HELLO @txt OUTPUT

Quando per le regole di confronto dell'istanza di SQL Server viene fatta distinzione tra maiuscole e minuscole, non sarà possibile chiamare la stored procedure estesa con una combinazione diversa tra maiuscole e minuscole, anche se è stata registrata esattamente con lo stesso nome e le stesse regole di confronto della funzione nella DLL.

--Register the function (xp_hello)
sp_addextendedproc 'xp_hello', 'c:\xp_hello.dll'

--The following will result in an error
DECLARE @txt varchar(33)
EXEC xp_HELLO @txt OUTPUT

--This is the error
Server: Msg 2812, Level 16, State 62, Line 1

Non è necessario arrestare e riavviare SQL Server.