Supondo que eu tenha a seguinte tabela:
Create Table [dbo].[Test_IP]
(
[IP] varchar(40),
[IPType] varchar(6)
)
Existem mais triggers nesta tabela, mas todos eles são triggers AFTER, e é um banco de dados grande com muitas tabelas, views e procs armazenados, e tem sido usado em vários processos.
Eu adicionei uma tabela de log e gatilhos como este
Create Table [dbo].[Log_Test_IP]
(
[Action] varchar(10),
[IP] varchar(40),
[IPType] varchar(6)
)
GO
Create Trigger MYTR_Log_Test_IP_INS On [dbo].[Test_IP] After insert AS
BEGIN
insert into [dbo].[Log_Test_IP]([Action],[IP],[IPType])
select 'Insert', [IP], [IPType] from inserted
END
GO
Create Trigger MYTR_Log_Test_IP_DEL On [dbo].[Test_IP] After delete AS
BEGIN
insert into [dbo].[Log_Test_IP]([Action],[IP],[IPType])
select 'Delete', [IP], [IPType] from deleted
END
GO
Agora estou chegando à parte interessante: quando insiro diretamente na Test_IP
tabela, posso ver que o gatilho Insert está funcionando, mas quando funciona regularmente de um aplicativo ou serviço (que não tenho ideia do que faz) não ver qualquer registro de inserção na tabela de log, só consigo ver os registros 'Excluir', mesmo que estivesse vazio no início.
Minha conclusão é que existe alguma maneira de contornar os gatilhos, existem muitos gatilhos e procedimentos armazenados no banco de dados e não tenho ideia de onde procurar.
Então, minha pergunta é como você pode ignorar o gatilho?
Os gatilhos não serão executados em alguns cenários.
1) Obviamente, se o gatilho estiver desabilitado
2) Se o gatilho estiver marcado como NÃO PARA REPLICAÇÃO e o DML for emitido pelo Agente de Distribuição de replicação.
3) Se o usuário tiver permissões ALTER TABLE e estiver executando um BULK INSERT, BCP ou SqlBulkCopy, etc com a opção FIRE_TRIGGERS desabilitada.
Você não pode ignorar um gatilho, ele sempre será acionado com base nos critérios de criação, a menos que seja desativado. Você pode curto-circuitar o gatilho usando objetos temporários ou context_info(), mas com base em sua descrição, isso não é provável.
Seu gatilho deveria estar disparando, mas não está e isso é um pouco preocupante. Estou pensando que a troca de partição pode até estar em jogo. Eu ficaria longe do profiler ou traces, pois eles estão obsoletos.
Eu começaria rastreando a atividade na tabela, aqui está um script de evento estendido escrito por Grant Fritchey que capturará todas as consultas ADHOC nessa tabela.
Fonte do SQL Central escrito por Grant Fritchey - The Scary DBA
Eu também procuraria capturar os eventos que atualizam ou inserem a tabela nos logs de auditoria.
Nic do Stack Overflow escreveu o código abaixo:
Fonte de código SQL Audit por Nic of Stack Overflow source.
Como último recurso, eu procuraria ler todos os procedimentos armazenados e examinar qualquer coisa que fizesse referência a essa tabela.
Chains from stack overflow tem um pequeno trecho para você e mais aqui para determinar as tabelas que estão sendo usadas em procedimentos armazenados.
Como sempre, teste isso em um ambiente de desenvolvimento e propague para produção com cuidado e controle de qualidade adequado.
Mais uma vez, obrigado Grant , Chains e Nic por suas contribuições!
Você pode tentar com o SQL Server Profiler e ver o que está acontecendo com o aplicativo. O evento SP:StmtCompleted deve ser adicionado ao rastreamento