Eu adicionei uma tabela simples a um banco de dados chamado: aaa_log com colunas :( id
, name
, op
))
CREATE TABLE aaa_log (
[id] [int] IDENTITY(1,1) PRIMARY KEY NOT NULL,
[name] [varchar](50) NOT NULL,
[op] [varchar](50) NULL)
id
coluna usada apenas para manter a ordem.
Eu adicionei um gatilho ( for insert, update, delete
) a todas as outras tabelas em um banco de dados usando o seguinte script:
declare @cmd varchar(max)
declare trigger_create cursor for
select 'Create trigger ['+TABLE_SCHEMA+'].[xxtr_'+TABLE_NAME+'_auto]
on ['+TABLE_SCHEMA+'].['+TABLE_NAME+'] fro insert,update,delete as
BEGIN
declare @op varchar(20)
if exists(SELECT * from inserted) and exists(SELECT * from deleted)
begin
set @op = ''update''
end
if exists(SELECT * from inserted) and not exists(SELECT * from deleted)
begin
set @op = ''insert''
end
if not exists(SELECT * from inserted) and exists(SELECT * from deleted)
begin
set @op = ''delete''
end
insert into aaa_log([name],[op]) values('+TABLE_SCHEMA+'.'+TABLE_NAME+', @op)
END
'
from information_schema.tables
where table_type='BASE TABLE' AND table_name <> 'aaa_log'
open trigger_create
fetch next from trigger_create into @sql
while @@FETCH_STATUS =0
BEGIN
exec(@sql)
fetch next from trigger_create into @sql
END
close trigger_create
deallocate trigger_create
Ninguém mais atualiza a aaa_log
tabela, apenas esses gatilhos, mas quando eu verifico a aaa_log
tabela vejo algumas linhas onde op
é NULL.
A única opção que consigo pensar é que tanto inserido quanto atualizado é nulo, então como o gatilho foi ativado?
Alguma explicação?
Você está contando com a presença de linhas em um
inserted
oudeleted
(ou ambos). O que acontece quando nenhuma linha é afetada? O gatilho ainda dispara.Para evitar esse tipo de coisa, normalmente as pessoas iniciam seu gatilho com algo como:
A verificação
@@ROWCOUNT
também é popular, mas acho muito mais frágil.Pergunta: Você deve tomar alguma ação contra o banco de dados se nenhuma alteração for feita? Isso parece que desnecessariamente desacelerará seu aplicativo e não é uma prática recomendada.
Eu diria aqui que uma solução melhor seria remover as transações desnecessárias do banco de dados, se possível.
Se esse gatilho for feito para auditar de alguma forma (o que parece ser), a resposta de @Aaron Bertrand não registrará nenhuma atualização na tabela de auditoria.