Compartilhar via


Adicionando um procedimento armazenado estendido ao SQL Server

Observação importanteImportante

Esse recurso será removido em uma versão futura do Microsoft SQL Server. Não utilize esse recurso em desenvolvimentos novos e modifique, assim que possível, os aplicativos que atualmente o utilizam. Use a Integração CLR em vez disso.

Uma DLL que contém funções de procedimento armazenado estendido funciona como uma extensão do SQL Server. Para instalar a DLL, copie o arquivo em um diretório, que contenha, por exemplo, os arquivos de DLL padrão do SQL Server (C:\Arquivos de Programas\Microsoft SQL Server\MSSQL10_50.x\MSSQL\Binn por padrão).

Depois que uma DLL de procedimento armazenado estendido é copiada para o servidor, um administrador do sistema do SQL Server deve registrar no SQL Server todas as funções de procedimento armazenado estendido na DLL. Isso é feito por meio do uso do procedimento armazenado de sistema sp_addextendedproc.

Observação sobre segurançaObservação sobre segurança

O administrador do sistema deve examinar inteiramente um procedimento armazenado estendido para garantir que ele não contenha códigos perigosos ou mal-intencionados, antes de adicioná-lo ao servidor e conceder permissões de execução aos demais usuários. Valide todas as entradas de usuário. Não concatene uma entrada de usuário antes de validá-la. Nunca execute um comando construído por uma entrada de usuário inválida. Para obter mais informações sobre a validação de entrada, consulte Injeção SQL.

O primeiro parâmetro de sp_addextendedproc especifica o nome da função e o segundo, o nome da DLL em que reside essa função. É recomendável especificar o caminho completo da DLL.

Observação importanteImportante

As DLLs existentes que não foram registradas com um caminho completo não funcionarão depois da atualização para o SQL Server 2005. Para corrigir o problema, use sp_dropextendedproc para cancelar o registro da DLL e registrá-la novamente com sp_addextendedproc, especificando o caminho completo.

O nome da função especificada em sp_addextendedproc deve ser exatamente o mesmo, inclusive maiúsculas e minúsculas, bem como o nome da função na DLL. Por exemplo, esse comando registra uma função xp_hello,, localizada em uma dll denominada xp_hello.dll, como um procedimento armazenado do SQL Server:

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

Se o nome da função especificado em sp_addextendedproc não corresponder exatamente ao nome da função na DLL, o novo nome será registrado no SQL Server, mas o nome não poderá ser usado. Por exemplo, embora xp_Hello esteja registrado como um procedimento armazenado estendido do SQL Server localizado em xp_hello.dll, o SQL Server não poderá localizar a função na DLL se você usar xp_Hello para chamar a função depois.

--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 o nome da função especificado em sp_addextendedproc corresponder exatamente ao nome da função na DLL, e o agrupamento da instância do SQL Server diferenciar maiúsculas e minúsculas, o usuário poderá chamar o procedimento armazenado estendido usando qualquer combinação de letras maiúsculas e minúsculas no 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 o agrupamento da instância do SQL Server diferenciar maiúsculas de minúsculas, o SQL Server não poderá chamar o procedimento armazenado estendido – mesmo que tenha sido registrado exatamente com o mesmo nome e agrupamento da função na DLL –, se o procedimento for chamado com um uso de maiúsculas e minúsculas diferente.

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

Não é necessário parar e reiniciar o SQL Server.