是否存在未触发触发器的任何条件?
我们遇到这种情况:
我们有一个表,有些行已被删除。我们需要知道删除这些行的人和/或时间。
我们创建此触发器:
ALTER TRIGGER [dbo].[AUDITdel_nit] ON [dbo].[Client]
FOR DELETE
AS
Insert into AUDIT select 'Delete', getdate(), 'Row Deleted', SYSTEM_USER, host_name(),
(select 'ID Client: ' + convert(varchar(12),Id) from deleted), 'Client' ,APP_NAME()
我们做了一些测试:通过存储过程删除行,删除的行显示在AUDIT表中。
但是今天我们突然发现一行没有出现在AUDIT表中......
知道可能出现什么问题吗?
答案 0 :(得分:1)
您需要让它处理目前无法执行的多个记录删除。必须始终编写所有触发器,假设将删除,插入或更新多个记录。
ALTER TRIGGER [dbo].[AUDITdel_nit] ON [dbo].[Client]
FOR DELETE AS
INSERT INTO AUDIT
SELECT 'Delete', getdate(), 'Row Deleted', SYSTEM_USER, host_name(),
'ID Client: ' + convert(varchar(12),Id) , 'Client' ,APP_NAME()
FROM DELETED
批量插入也可以绕过触发器,截断表不涉及触发器,因为未记录操作,但我认为这些不是您的问题。也可以运行Openrowset语句来忽略触发器。您可以在代码中搜索此短语,以查看进程是否正在执行此操作:WITH(IGNORE_TRIGGERS)。您还可以专门禁用并重新启用触发器,但生产中没有人应该拥有除dbas之外的权限。如果每个人都拥有这些权利,您需要尽快解决这个问题。
答案 1 :(得分:0)
你能检查一下你的触发器是否无效吗?
SELECT * FROM ALL_OBJECTS WHERE OBJECT_NAME = 'your_trigger' AND OBJECT_TYPE = 'TRIGGER' AND STATUS <> 'VALID'
答案 2 :(得分:0)
我认为删除后的插入语句不起作用。因此,您可以检查审计插入失败的原因。
Insert into AUDIT select 'Delete', getdate(), 'Row Deleted', SYSTEM_USER, host_name(),
(select 'ID Client: ' + convert(varchar(12),Id) from deleted), 'Client' ,APP_NAME()
答案 3 :(得分:0)
由于您正在使用触发器,因此客户端表的某些更改是否可能由其他触发器引起,并且nested triggers
选项设置为0?这不是默认设置,但在这种情况下会导致触发器不触发。该效果的演示如下。要查看是否已设置此选项,只需运行没有参数的sp_configure
,然后找到nested triggers
行。
sp_configure 'nested triggers','0'
go
reconfigure
go
create table T3 (
ID int not null
)
go
create table T2 (
ID int not null
)
go
create trigger T_T2
on T2
for insert
as
insert into T3(ID) select ID from inserted
go
create table T1 (
ID int not null
)
go
create trigger T_T1
on T1
for insert
as
insert into T2(ID) select ID from inserted
go
insert into T1(ID)
select 1
go
select * from T1
select * from T2
select * from T3
消息&amp;结果:
Configuration option 'nested triggers' changed from 1 to 0. Run the RECONFIGURE statement to install.
(1 row(s) affected)
ID
----
1
(1 row(s) affected)
ID
----
1
(1 row(s) affected)
ID
----
(0 row(s) affected)