Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Aplica-se a:SQL Server
Importante
Esse recurso será removido em uma versão futura do SQL Server. Evite usar esse recurso em novos trabalhos de desenvolvimento e planeje modificar aplicativos que atualmente usam esse recurso. Usa antes integração com CLR .
Como funcionam os procedimentos armazenados estendidos
O processo pelo qual um procedimento armazenado estendido funciona é:
Quando um cliente executa um procedimento armazenado alargado, o pedido é transmitido em formato de fluxo de dados tabulares (TDS) ou Protocolo de Acesso a Objetos Simples (SOAP) da aplicação cliente para o SQL Server.
O SQL Server procura a DLL associada ao procedimento armazenado estendido e carrega a DLL se esta ainda não estiver carregada.
O SQL Server chama o procedimento armazenado estendido solicitado (implementado como uma função dentro da DLL).
O procedimento armazenado estendido passa conjuntos de resultados e parâmetros de retorno ao servidor através da API de Procedimentos Armazenados Estendidos.
No passado, os Serviços de Dados Abertos eram usados para escrever aplicações servidoras, como gateways para ambientes de bases de dados não SQL Server. O SQL Server não suporta as partes obsoletas da API Open Data Services. A única parte da API original de Serviços de Dados Abertos ainda suportada pelo SQL Server são as funções de procedimento armazenado estendido, pelo que a API foi renomeada para API de Procedimentos Armazenados Estendidos.
Com o surgimento das consultas distribuídas e da integração com CLR, a necessidade de aplicações API de Procedimentos Armazenados Estendidos foi em grande parte substituída.
Se já tiveres aplicações de gateway, não podes usar as opends60.dll que vêm com o SQL Server para correr as aplicações. As aplicações de gateway já não são suportadas.
Procedimentos armazenados alargados vs. integração com CLR
A integração com CLR oferece uma alternativa mais robusta à escrita de lógica do lado do servidor, que era difícil de expressar ou impossível de escrever em Transact-SQL. Em versões anteriores do SQL Server, os procedimentos armazenados estendidos (XPs) forneciam o único mecanismo disponível para os programadores de aplicações de bases de dados escreverem tal código.
Com a integração CLR, a lógica que antes era escrita sob a forma de procedimentos armazenados é frequentemente melhor expressa como funções de valores em tabelas, que permitem que os resultados construídos pela função sejam consultados em SELECT instruções ao incorporá-los FROM na cláusula.
Para mais informações, consulte a visão geral da integração CLR.
Características de execução de procedimentos armazenados estendidos
A execução de um procedimento armazenado alargado tem as seguintes características:
A função de procedimento armazenado alargado é executada no contexto de segurança do SQL Server.
A função de procedimento armazenado estendido corre no espaço de processos do SQL Server.
O thread associado à execução do procedimento armazenado estendido é o mesmo usado para a ligação ao cliente.
Importante
Antes de adicionar procedimentos armazenados estendidos ao servidor e conceder permissões de execução a outros utilizadores, o administrador do sistema deve rever cuidadosamente cada procedimento armazenado estendido para garantir que não contém código prejudicial ou malicioso.
Após o carregamento da DLL do procedimento armazenado estendido, a DLL permanece carregada no espaço de endereçamento do servidor até que o SQL Server seja parado ou o administrador descarregue explicitamente a DLL usando DBCC <DLL_name> (FREE).
O procedimento armazenado estendido pode ser executado a partir de Transact-SQL como um procedimento armazenado usando a EXECUTE instrução:
EXECUTE @retval = xp_extendedProcName @param1, @param2 OUTPUT;
Parâmetros
@ Retval
Um valor de devolução.
@ param1
Um parâmetro de entrada.
@ param2
Um parâmetro de entrada/saída.
Atenção
Os procedimentos armazenados estendidos oferecem melhorias de desempenho e alargam a funcionalidade do SQL Server. No entanto, como a DLL do procedimento armazenado estendido e o SQL Server partilham o mesmo espaço de endereçamento, um procedimento problemático pode afetar negativamente o funcionamento do SQL Server. Embora as exceções lançadas pela DLL de procedimentos armazenados estendidos sejam tratadas pelo SQL Server, é possível danificar áreas de dados do SQL Server. Como medida de segurança, apenas os administradores de sistemas SQL Server podem adicionar procedimentos armazenados estendidos ao SQL Server. Estes procedimentos devem ser cuidadosamente testados antes de serem instalados.
Enviar conjuntos de resultados para o servidor com a API de Procedimentos Armazenados Estendidos
Ao enviar um conjunto de resultados para SQL Server, o procedimento armazenado estendido deve chamar a API apropriada da seguinte forma:
A
srv_sendmsgfunção pode ser chamada em qualquer ordem antes ou depois de todas as linhas (se existirem) serem comsrv_sendrow. Todas as mensagens devem ser enviadas ao cliente antes de o estado de conclusão ser enviado comsrv_senddone.A
srv_sendrowfunção é chamada uma vez por cada linha enviada ao cliente. Todas as linhas devem ser enviadas ao cliente antes de quaisquer mensagens, valores de estado ou estados de conclusão serem enviados comsrv_sendmsg, osrv_statusargumento desrv_pfield, ousrv_senddone.Enviar uma linha que não tem todas as colunas definidas
srv_describefaz com que a aplicação gere uma mensagem de erro informativa e regresseFAILao cliente. Neste caso, a fila não é enviada.
Criar procedimentos armazenados alargados
Um procedimento armazenado alargado é uma função C/C++ com um protótipo:
SRVRETCODE xp_extendedProcName ( SRVPROC *);
Usar o prefixo xp_ é opcional. Os nomes de procedimentos armazenados estendidos são sensíveis a maiúsculas minúsculas quando referenciados em instruções Transact-SQL, independentemente da página de código/ordem de ordenação instalada no servidor. Quando constróis uma DLL:
Se for necessário um ponto de entrada, escreve uma
DllMainfunção.Esta função é opcional. Se não o fornecer em código-fonte, o compilador liga a sua própria versão, que não faz mais do que devolver
TRUE. Se fornecer umaDllMainfunção, o sistema operativo chama essa função quando uma thread ou processo se liga ou se desliga da DLL.Todas as funções chamadas de fora da DLL (todas as Efunctions de procedimento armazenado estendido) devem ser exportadas.
Pode exportar uma função listando o seu nome na
EXPORTSsecção de um.defficheiro, ou pode prefixar o nome da função no código-fonte com__declspec(dllexport), uma extensão do compilador Microsoft (__declspec()começa com dois sublinhados).
Estes ficheiros são necessários para criar uma DLL de procedimento armazenado estendido.
| Ficheiro | Description |
|---|---|
srv.h |
Ficheiro de cabeçalho da API de Procedimentos Armazenados Estendidos |
opends60.lib |
Biblioteca de importação para opends60.dll |
Para criar uma DLL de procedimento armazenado estendido, crie um projeto do tipo Dynamic Link Library. Para mais informações sobre como criar uma DLL, consulte a documentação do ambiente de desenvolvimento.
Todas as DLLs de procedimentos armazenados estendidos devem implementar e exportar a seguinte função:
__declspec(dllexport) ULONG __GetXpVersion()
{
return ODS_VERSION;
}
__declspec(dllexport) é uma extensão de compilador específica da Microsoft. Se o seu compilador não suportar esta diretiva, deve exportar esta função no seu DEF ficheiro na EXPORTS secção.
Quando o SQL Server é iniciado com a bandeira -T260 de rastreio ou se um utilizador com privilégios de administrador do sistema é executado DBCC TRACEON (260), e se a DLL do procedimento armazenado estendido não suportar __GetXpVersion(), a seguinte mensagem de aviso é impressa no registo de erros (__GetXpVersion() começa com dois sublinhados).
Error 8131: Extended stored procedure DLL '%' does not export __GetXpVersion().
Se a DLL do procedimento armazenado estendido exporta __GetXpVersion(), mas a versão devolvida pela função for inferior à versão exigida pelo servidor, uma mensagem de aviso indicando a versão devolvida pela função e a versão esperada pelo servidor é impressa no registo de erros. Se receber esta mensagem, está a devolver um valor incorreto de __GetXpVersion(), ou está a compilar com uma versão mais antiga de srv.h.
Observação
SetErrorMode, uma função Win32, não deve ser chamada em procedimentos armazenados estendidos.
Procedimentos armazenados prolongados devem ser chamados srv_got_attention periodicamente, para que o procedimento possa terminar se a ligação for cortada ou se o batch for abortado.
Para depurar uma DLL de procedimento armazenado estendido, copie-a para o diretório SQL Server \Binn . Para especificar o executável da sessão de depuração, introduza o caminho e o nome do ficheiro executável do SQL Server (por exemplo, C:\Program Files\Microsoft SQL Server\MSSQL16.MSSQLSERVER\MSSQL\Binn\sqlservr.exe). Para informações sobre sqlservr argumentos, veja sqlservr Application.
Adicionar um procedimento armazenado alargado ao SQL Server
Uma DLL que contém funções de procedimento armazenado estendidas funciona como uma extensão do SQL Server. Para instalar a DLL, copie o ficheiro para um diretório, como aquele que contém os ficheiros DLL padrão do SQL Server (C:\Program Files\Microsoft SQL Server\MSSQL16.0.<x>\MSSQL\Binn por defeito).
Depois de a DLL do procedimento armazenado estendido ser copiada para o servidor, um administrador do sistema SQL Server deve registar no SQL Server cada função de procedimento armazenado estendido na DLL. Isto é feito usando o sp_addextendedproc procedimento armazenado do sistema.
Importante
O administrador do sistema deve rever cuidadosamente um procedimento armazenado alargado para garantir que não contém código prejudicial ou malicioso antes de o adicionar ao servidor e conceder permissões de execução a outros utilizadores. Valide todas as entradas do utilizador. Não concatene a entrada do utilizador antes de a validar. Nunca execute um comando construído a partir de entradas de usuário não validadas.
O primeiro parâmetro de sp_addextendedproc especifica o nome da função, e o segundo parâmetro especifica o nome da DLL em que essa função reside. Deves especificar o caminho completo da DLL.
Observação
DLLs existentes que não estavam registadas com um caminho completo não funcionam depois de atualizarem para o SQL Server 2005 (9.x) ou uma versão posterior. Para corrigir o problema, use-se sp_dropextendedproc o desregisto da DLL e depois volte-o a registar especificando sp_addextendedproc, o caminho completo.
O nome da função especificada em sp_addextendedproc deve ser exatamente o mesmo, incluindo o caso, que o nome da função na DLL. Por exemplo, este comando regista uma função xp_hello, localizada num dll chamada xp_hello.dll, como um procedimento armazenado estendido do SQL Server:
sp_addextendedproc 'xp_hello', 'c:\Program Files\Microsoft SQL Server\MSSQL13.0.MSSQLSERVER\MSSQL\Binn\xp_hello.dll';
Se o nome da função especificada não sp_addextendedproc corresponder exatamente ao nome da função na DLL, o novo nome é registado no SQL Server, mas o nome não é utilizável. Por exemplo, embora xp_Hello esteja registado como um procedimento armazenado estendido do SQL Server localizado em xp_hello.dll, o SQL Server não consegue encontrar a função na DLL se usar xp_Hello para chamar a função mais tarde.
-- 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;
Aqui está a mensagem de erro:
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 especificada corresponder sp_addextendedproc exatamente ao nome da função na DLL, e a colação da instância SQL Server for indistinta a maiúsculas e minúsculas, o utilizador pode chamar o procedimento armazenado estendido usando qualquer combinação de letras minúsculas e maiúsculas do nome.
-- Register the function (xp_hello)
sp_addextendedproc 'xp_hello', 'c:\xp_hello.dll';
-- The following example succeeds 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 a colação da instância do SQL Server é sensível a maiúsculas e minúsculas, o SQL Server não pode chamar o procedimento armazenado estendido se o procedimento for chamado com um caso diferente. Isto é verdade mesmo que tenha sido registado com exatamente o mesmo nome e colação que a função na DLL.
-- Register the function (xp_hello)
sp_addextendedproc 'xp_hello', 'c:\xp_hello.dll';
-- The following example results in an error
DECLARE @txt VARCHAR(33);
EXEC xp_HELLO @txt OUTPUT;
Aqui está a mensagem de erro:
Server: Msg 2812, Level 16, State 62, Line 1
Não precisas de parar e reiniciar o SQL Server.
Consultar procedimentos armazenados estendidos instalados no SQL Server
Um utilizador autenticado com SQL Server pode exibir os procedimentos armazenados estendidos atualmente definidos e o nome da DLL a que cada um pertence, executando o sp_helpextendedproc procedimento do sistema. Por exemplo, o exemplo seguinte devolve a DLL a que xp_hello pertence:
sp_helpextendedproc 'xp_hello';
Se sp_helpextendedproc for executado sem especificar um procedimento armazenado estendido, todos os procedimentos armazenados estendidos e as suas DLLs são exibidos.
Remover um procedimento armazenado alargado do SQL Server
Para eliminar cada função de procedimento armazenado estendido numa DLL de procedimento armazenado estendido definida pelo utilizador, um administrador do sistema SQL Server deve executar o sp_dropextendedproc procedimento armazenado do sistema, especificando o nome da função e o nome da DLL onde essa função reside. Por exemplo, este comando remove a função xp_hello, localizada numa DLL nomeada xp_hello.dll, do SQL Server:
sp_dropextendedproc 'xp_hello';
sp_dropextendedproc Não elimina os procedimentos armazenados estendidos do sistema. Em vez disso, o administrador do sistema deve negar EXECUTE permissão para o procedimento armazenado alargado ao papel público .
Descarregar uma DLL de procedimento armazenado estendido
O SQL Server carrega uma DLL de procedimento armazenado estendido assim que uma chamada é feita para uma das funções da DLL. A DLL permanece carregada até que o servidor seja desligado ou até que o administrador do sistema use a DBCC instrução para a descarregar. Por exemplo, este comando descarrega o xp_hello.dll, permitindo ao administrador do sistema copiar uma versão mais recente deste ficheiro para o diretório sem desligar o servidor:
DBCC xp_hello(FREE);
Conteúdo relacionado
- Integração CLR (Common Language Runtime)
- Funções Table-Valued CLR
- Procedimentos Armazenados Estendidos do Motor de Base de Dados - Programação
- Consulta a Procedimentos Armazenados Estendidos Instalados no SQL Server
- srv_got_attention (API de Procedimentos Armazenados Estendidos)
- sp_addextendedproc (Transact-SQL)
- sp_dropextendedproc (Transact-SQL)
- sp_helpextendedproc (Transact-SQL)
- NOME DLL DBCC (GRÁTIS) (Transact-SQL)