Eu tenho duas tabelas: dbo.old_roles
e dbo.new_roles
. Eu preciso sincronizar entre os dois.
Quando o papel criado ou modificado em uma tabela deve atualizar a outra. Para isso criei uma trigger em cada uma das tabelas.
Para evitar um loop, desejo desabilitar o gatilho em uma tabela quando um gatilho é disparado da outra tabela.
Quando ligo para ALTER TRIGGER
statement., recebo um erro.
O que posso fazer?
Você tem três opções:
Desative "gatilhos aninhados" usando
sp_configure
. Esta é uma opção de nível de servidor/instância, portanto, pode desabilitar a funcionalidade em outras áreas onde você pode ter gatilhos chamando outros gatilhos. Mas deveria pelo menos ser mencionado. Você pode ver a configuração atual usando o seguinte:E você pode desativar essa habilidade usando o seguinte:
Você pode ler mais sobre essa configuração aqui: Configure the nested triggers Server Configuration Option .
Faça com que cada gatilho detecte quantos níveis de profundidade eles estão usando a função TRIGGER_NESTLEVEL . Use isso no início de cada gatilho para simplesmente sair se não for a 1ª ou 2ª execução de gatilho na pilha. Algo na linha de:
Isso exigirá um pouco de teste para ver como é afetado pela inserção inicial feita por outro gatilho (no caso de isso se tornar um problema, mas pode não ser). Se não funcionar como esperado quando chamado por outro gatilho, tente definir alguns dos parâmetros para esta função. Consulte a documentação (link acima) para obter detalhes.
Defina um sinalizador nas "informações de contexto" baseadas em sessão usando SET CONTEXT_INFO . Informações de contexto são um
VARBINARY(128)
valor que existe no nível da sessão e retém seu valor até ser substituído ou até que a sessão termine. O valor pode ser recuperado usando a função CONTEXT_INFO ou selecionando acontext_info
coluna de qualquer um dos seguintes DMVs: sys.dm_exec_requests e sys.dm_exec_sessions .Você pode colocar o seguinte no início de cada um desses gatilhos:
Esta opção não funciona tão bem se você já estiver usando Context Info por algum outro motivo. Porém, qualquer pessoa que use o SQL Server 2016 pode usar SESSION_CONTEXT , que é um novo conjunto de pares chave-valor baseado em sessão.