SQL触发器不起作用

时间:2011-02-28 15:23:32

标签: sql triggers sql-delete

是否存在未触发触发器的任何条件?

我们遇到这种情况:

我们有一个表,有些行已被删除。我们需要知道删除这些行的人和/或时间。

我们创建此触发器:

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表中......

知道可能出现什么问题吗?

4 个答案:

答案 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)