Versão curta: Alguém conhece uma maneira - dentro de um gatilho SQL 2000 - de detectar qual processo modificou os dados e sair do gatilho se um processo específico for detectado?
Versão longa Eu tenho uma rotina de sincronização personalizada que move dados para frente e para trás entre esquemas de banco de dados diferentes.
Quando este processo pega um registro modificado do Banco de Dados A, ele precisa transformá-lo em um registro que vai para o Banco de Dados B. Os bancos de dados são radicalmente diferentes, mas compartilham alguns dos mesmos dados, como contas de usuário e atividade do usuário (no entanto, mesmo essas tabelas são estruturalmente diferentes).
Quando os dados são modificados em uma das tabelas pertinentes, um gatilho é acionado que grava o PK desse registro em uma tabela "sincronizada". Esta tabela "sync" é monitorada por um processo (um stored proc) que irá capturar os PK's em sequência, e copiar os dados relacionados do banco de dados A para o banco de dados B, fazendo as transformações necessárias.
Ambos os bancos de dados possuem triggers que disparam e copiam o PK para a tabela de sincronização, porém essas triggers devem ignorar o próprio processo de sincronização para não entrar em loop "sem fim" (ou menos, dependendo dos limites de aninhamento).
No SQL 2005 e superior, uso o seguinte código no processo de sincronização para se identificar:
SET CONTEXT_INFO 0xHexValueOfProcName
Cada gatilho tem o seguinte código no início, para ver se o processo que modificou os dados é o próprio processo de sincronização:
SE (CONTEXT_INFO() = 0xHexValueOfProcName) COMEÇAR -- print '## Process Sync Queue detectado. Este gatilho está saindo! ##' Retorna FIM
Este sistema funciona muito bem, continue trabalhando, mantém os dados sincronizados. O problema agora, porém, é que um servidor SQL2000 deseja entrar na festa.
Alguém conhece uma maneira - dentro de um gatilho SQL 2000 - de detectar qual processo modificou os dados e sair do gatilho se um determinado processo for detectado?
Obrigado rapazes!
SET CONTEXT_INFO também existe para SQL Server 2000.
No entanto, você deve consultar
sysprocesses.context_info
para lê-lo de volta.CONTEXT_INFO()
era novo para o SQL Server 2005.