Artigo: 190987 - Última revisão: terça-feira, 9 de Maio de 2006 - Revisão: 6.4 Como utilizar procedimentos armazenados estendidos
Nesta páginaSumárioEste artigo descreve a criação adequada e implementação de alargada procedimentos armazenados do SQL Server. Além disso, este artigo fornece detalhes e referências para efectuar uma implementação bem sucedida do SQL Server expandido procedimentos armazenados. Procedimentos armazenados estendidos são uma forma muito eficaz para expandir a funcionalidade do SQL Server. É o seguinte excerto de SQL Server Books Online: Procedimentos armazenados estendidos fornecem uma forma dinâmica carregar e executar uma função numa biblioteca de ligação dinâmica (DLL) de uma forma semelhante de um procedimento armazenado, facilmente expandir do SQL Server funcionalidade. Acções fora do SQL Server podem ser accionadas e externas facilmente informações devolvidas ao SQL Server. Códigos de estado devolvido e parâmetros de saída (idênticos às respectivas cópias existentes em procedimentos armazenados normais) também são suportados. SQL Server inclui armazenado do sistema procedimentos que adicionar (sp_addextendedproc), largue (sp_dropextendedproc) e fornecem informações sobre (sp_helpextededproc) expandido procedimentos armazenados. Tem de tratar o procedimento armazenado expandido DLL como qualquer outro desenvolvimento DLL: é código partilhado e vários threads podem aceder ao mesmo tempo. Se tal como com qualquer projecto production-worthy esqueça utilizar estrutura completa e concluir o teste. Para escrever procedimentos armazenados estendidos com êxito, terá conhecimento prático de muitos tópicos. Para rever estes tópicos, consulte os capítulos seguintes no Windows Advanced por Jeffrey Richter:
http://www.microsoft.com/products/info/product.aspx?view=22&pcid=ab0cdef1-acfe-71c1-d09b-06567808e1e7
(http://www.microsoft.com/products/info/product.aspx?view=22&pcid=ab0cdef1-acfe-71c1-d09b-06567808e1e7)
RegistoA arquitectura do procedimento armazenado expandido não é complicada; é um Microsoft Visual C ou C++ DLL compatível que está associado o ficheiro Opends60.lib que expõe função exportados correctamente (ou funções). Utilizar o procedimento armazenado sp_addextendedproc para registar o nome de função exportada e a DLL associada. Consulte o xp , xp_dblib e exemplos de xp_odbc incluídos na Toolkit para programadores de SQL Server para obter exemplos. Para aceder Toolkit para programadores de SQL Server, visite a página do SQL Server no seguinte Web site da Microsoft:http://www.microsoft.com/sql/default.mspx
(http://www.microsoft.com/sql/default.mspx)
Procedimentos armazenados estendidos são registados na base de dados principal e o administrador do sistema (SA, Security ASSOCIATION) mantém controlar a respectiva utilização e o registo. Quando registar a DLL, certifique-se se está no caminho do sistema actual e que segue a 8.3 convenção de nomenclatura de ficheiro. Para obter mais informações, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base: 151596
(http://support.microsoft.com/kb/151596/
)
Expandido procedimento erro: "Não é possível localizar a DLL 'xxx.dll'" O espaço de endereçosSQL Server utiliza LoadLibrary GetModuleHandle e GetProcAddress para obter um apontador para função exportada e, em seguida, passar a função de uma estrutura SRVPROC. Depois da DLL recebe a estrutura SRVPROC, pode efectuar operações de abrir Serviços de dados padrão para obter parâmetros de e para devolver resultados para o autor da chamada.Como uma DLL, é carregado no espaço de endereço do processo de chamada. No caso do procedimento armazenado expandido, o processo é do SQL Server. Se uma DLL incorrecta aceder a memória ou se não se trata de thread de segurança, pode afectar negativamente o processo. Tem de executar teste exaustivo para garantir que a DLL mantém a integridade do processo. Se estiver preocupado em todos os de que um procedimento armazenado expandido pode ser afectar negativamente do SQL Server, terá de resolver este problema imediatamente. Por exemplo, pode utilizar o Microsoft Visual C ou assistentes do Microsoft Visual C++ para criar um assistente DevStudio Add-in. Este assistente é um servidor COM em processo ou DLL. Se não gravar correctamente o assistente, pode afectar negativamente o processo. ExemploSQL Server tentará proteger o espaço de endereços. Invocação de um procedimento armazenado expandido é moldada numa tentativa / excepto bloco e muitos pontos no código efectuam verificação de correcção runtime mínimo. É importante lembrar que a protecção é fornecida por um tente / excepto bloco e não por um bloco try/catch. Por conseguinte, o código não efectuará pilha unwinding para objectos. Fugas de memóriaQualquer projecto pode ter um problema onde memória atribuída, uma alça ou um recurso semelhante não é a ser libertado correctamente. É extrema para qualquer conjunto de teste DLL que o conjunto torna-se de que a DLL está a libertar todos os recursos correctamente. Estes tipos de problemas é provável que Mostrar próprios como utilização de ficheiro de página maiores, desempenho alterado ou de paginação maior.Segurança de threadsAs aplicações como o Microsoft Internet Information Server (IIS) e Microsoft SQL Server são thread de agrupamento de aplicações multithread. Isto significa que pode iniciar a DLL de várias ligações ao mesmo tempo, especialmente num computador com múltiplos processadores. Isto também significa que uma única ligação pode chamar pontos de entrada diferente da DLL (XPROC, ISAPI) a partir de um thread de trabalho diferente. Agrupamento de threads pode limitar a utilidade das variáveis de thread local armazenamento (TLS).Certifique-se que todos os caminhos de código estão thread de segurança e re-entrant por ligação com bibliotecas de tempo de execução multithread e certifique-se que todos os fornecedores dll que está a utilizar são segurança do thread. Para obter mais informações sobre o armazenamento local do thread e uma conta detalhada dos problemas de segurança do thread, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base: 163449
(http://support.microsoft.com/kb/163449/
)
Utilização de memória local threads num procedimento armazenado expandido Estrutura de processamento de excepçõesTem de compreender também claramente tratamento de erros excepção estruturado. Cada ponto de entrada de uma DLL correctamente deve ter erros de excepção. SQL Server tenta detectar erros de excepção mas tem de qualquer DLL para capturar e processar erros de excepção correctamente. Especificamente, os threads que são iniciados de uma DLL tem de instalar processadores de erro de excepção estruturado.Cada thread num processo tem uma pilha de excepção. No entanto, se a DLL for iniciado um novo thread, começa a excepção naked. Se o thread não instalar um tente ou excepto ou um bloco try/catch imediatamente, o thread está apenas protegido pelo sistema operativo. Qualquer erro de excepção que o thread encontra é considerado unhanded e fatal todo o processo. Lembre-se a DLL está no espaço de processo do autor da chamada e este tipo de problema fará com que uma excepção fatal ao processo. SQL Server e componentes associados do SQL Server estão ligados com as versões da DLL de tempo de execução. Qualquer procedimento armazenado expandido que tenha desenvolvido também tem de estar ligado com as versões da DLL de tempo de execução. Ligações de loopbackUma ligação de loopback é efectuada quando o procedimento armazenado expandido estabelece uma ligação para o mesmo computador que esteja a executar o SQL Server. Estas são descritas as amostras xp_dblib e xp_odbc , estão incluídas o SQL Server Programmer Toolkit.Só é possível efectuar ligações de loopback em sessões dependentes. Um problema com uma ligação de loopback é que este é uma nova ligação, num espaço de transacção separado. Por exemplo, suponha que o procedimento armazenado expandido efectua um cálculo matemático complexo a tabela vendas. A ligação de loopback tenta concluir uma instrução SELECT da tabela ' Vendas '. No entanto, a ligação original tinha efectuado uma instrução UPDATE para a tabela de vendas . A menos que tenha obtido diligente cuidado para implementar um tempo limite de consulta, para executar consulta assíncrona processamento e verificar SRV_GOTATTENTION, esta ligação pode bloquear automaticamente. SQL Server 6.5 e versões posteriores do SQL Server suportam ligações dependentes. Consulte srv_getbindtoken e sp_bindsession para detalhes de implementação. Enlace da ligação loopback da ligação original coloca ambas as ligações no mesmo espaço de transacção. Isto significa que o bloco originalmente ocorreu na tabela vendas podem ser evitados. Nota SQL Server suporta apenas ligações de loopback em sessões dependentes. Para obter mais informações sobre problemas de bloqueio, clique números de artigo que se seguem para visualizar os artigos na base de dados de conhecimento da Microsoft: 162361
(http://support.microsoft.com/kb/162361/
)
Noções sobre e resolver problemas de bloqueios do SQL Server 6.x 180775
(http://support.microsoft.com/kb/180775/
)
Efeitos de cliente no débito do SQL Server Erros e mensagensOutro aspecto de uma ligação de loopback ou um procedimento armazenado expandido que estabelece uma ligação a outro computador que esteja a executar o SQL Server ou para um gateway de abrir Serviços de dados é o processamento de erros e mensagens.Se estiver a utilizar biblioteca de base de dados, tem de utilizar por processo mensagem de erro e processadores. SQL Server controla os processadores de mensagem global e um procedimento armazenado expandido não tem substituí-los. Processadores de mensagens de erro e por processo são também garantidamente segurança do thread. Consulte dbprocmsghandle e dbprocerrhandle para detalhes completos. sugestão Instalá-las no LOGINREC antes de chamar dbopen . Para obter mais informações sobre as limitações da utilização de biblioteca de base de dados num ambiente expandida, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base: 174817
(http://support.microsoft.com/kb/174817/
)
Microsoft SQL Server DB-Library limitou extensibilidade Com a API de serviços de dados abrir chamar srv_message_handler , pode colocar o texto no registo de erros do SQL Server. Para obter mais informações, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base: 164290
(http://support.microsoft.com/kb/164290/
)
CORRECÇÃO: Srv_message_handler texto limite Uma nota final sobre o processador de erro de biblioteca de base de dados: É possível devolver o valor INT_EXIT da função de chamada de retorno instalado. No entanto, como documentado, provoca a aplicação EXIT. Isto significa que são instruir o processo EXIT. Por este motivo, esta tem não ser chamada a partir de uma DLL devido os efeitos para aplicações tais como o IIS ou SQL Server.O Transact-SQL KILLOutro aspecto da ligação de loopback de execução do procedimento armazenado expandido geralmente é a utilização da instrução Transact-SQL KILL. Uma vez que a instrução de KILL é Transact-SQL com base, o conjunto de API de serviços de dados abrir actual não tem conhecimento do estado KILL Transact-SQL. Um procedimento armazenado expandido tem de procurar SRV_GOTATTENTION modo pode processar pedidos do cliente para cancelar a operação. No entanto, a SA actualmente não é possível emitir uma instrução Transact-SQL KILL para interromper a execução de um procedimento armazenado expandido. Isto torna mais importante que utilize correctamente ligações dependentes e boas práticas de codificação correctas. Uma estrutura alterar pedido (DCR) foi arquivado com o desenvolvimento do SQL Server para expandir a funcionalidade da instrução Transact-SQL KILL para procedimentos armazenados estendidos.Definições globaisNunca afecta o estado global de um processo de uma DLL. Por exemplo, SQL Server chama especificamente a chamada de API do Win32 SetErrorMode para definir o comportamento pretendido. Um procedimento armazenado expandido nunca deve chamar SetErrorMode ou outras chamadas global do processo porque se trata de global para o espaço de processo. Existem várias outras chamadas que afectam um processo global; Certifique-se de que a DLL não utiliza estas chamadas.Além disso, determinadas abrir dados dos serviços (ODS) chamadas concebidas unicamente para utilizar numa aplicação baseada no ODS e não deve ser utilizado um procedimento armazenado expandido. Estas incluem as chamadas tais como srv_init srv_config , srv_handle e srv_errhandle . Chamar estas funções substitui os valores que instala o SQL Server e pode provocar a falha imprevisíveis condições. Srv_SenddonePor predefinição, o SQL Server chama automaticamente srv_senddone expandido o procedimento armazenado com o sinalizador SRV_DONE_FINAL na devolução de invocação de um procedimento armazenado expandido. O procedimento armazenado expandido tem não chamada srv_senddone com o sinalizador SRV_DONE_FINAL; em vez disso, este tem de utilizar o sinalizador SRV_DONE_MORE.Fim de cadeiaQuando está a lidar com cadeias que são devolvidas abrir API de serviços de dados, tem de sempre certificar-se que a terminação ocorre. Uma cadeia que é devolvida de srv_paramdata expandido procedimento armazenado não é garantido que ser NULL terminou. Tem de utilizar srv_paramlen expandido o procedimento armazenado para manipular correctamente as cadeias. Outras funções de abrir Serviços de dados podem ser semelhantes; testá-las cuidadosamente.ReferênciasRichter, Jeffrey. Avançadas do Windows . Redmond, WA: Microsoft Press, 1997 Howard e David LeBlanc e Michael. Programar códigos seguros, Segunda Edição . Redmond, WA: Microsoft Press, 2002. A informação contida neste artigo aplica-se a:
Tradução automáticaIMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado. Clique aqui para ver a versão em Inglês deste artigo: 190987
(http://support.microsoft.com/kb/190987/en-us/
)
| Outros Recursos Outros Sites de Suporte
ComunidadesObtenha Ajuda AgoraTraduções de Artigos
|






Windows Live
Facebook
Twitter
Linkedin
Digg it
Yahoo
Delicious
StumbleUpon
Yammer
Reddit
Technorati
FriendFeed
Email


Voltar ao topo