Adicionando um procedimento armazenado estendido ao SQL Server
Importante |
---|
Esse recurso será removido em uma versão futura de Microsoft SQL Server. Não utilize esse recurso em desenvolvimentos novos e planeje modificar, 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 MicrosoftSQL Server. Para instalar a DLL, copie o arquivo para um diretório como, por exemplo, o que contém os arquivos DLL do SQL Server padrão (C:\Program Files\Microsoft SQL Server\MSSQL.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ç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.
Importante |
---|
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 especificado 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 chamada xp_hello.dll, como um procedimento armazenado estendido do SQL Server:
sp_addextendedproc 'xp_hello', 'c:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\Binn\xp_hello.dll'
Se o nome da função especificada em sp_addextendedproc não corresponder exatamente ao nome da função na DLL, o novo nome será registrado no SQL Server, mas não será utilizável. 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 conseguirá localizar a função na DLL se você usar xp_Hello para chamar a função posteriormente.
--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.).
Caso o nome da função especificada em sp_addextendedproc corresponda exatamente ao nome da função na DLL e o agrupamento da instância do SQL Server diferencie maiúsculas de minúsculas, o usuário pode chamar o procedimento armazenado estendido usando qualquer combinação de letras maiúsculas e minúsculas do 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.