在每个INSERT,DELETE上记录更改的触发器

时间:2011-08-12 09:38:16

标签: tsql sql-server-2008

我尝试创建一个触发器:

CREATE TRIGGER DataTrigger ON Data AFTER INSERT , DELETE
AS
BEGIN
IF EXISTS(SELECT * FROM Inserted)

INSERT INTO [dbo].[AuditTrail]
       ([ActionType]
       ,[TableName]
       ,[Name]
       ,[Time])

('INSERT'   //Incorrect syntax near 'INSERT'
    ,'Data' 
    ,SELECT col1 FROM Inserted
    ,CURRENT_TIMESTAMP  //Incorrect syntax near the keyword 'CURRENT_TIMESTAMP')
END

但它一直说我有错误,有人可以告诉我哪里做错了吗?
P / S:检测更新的最佳方法是什么? 谢谢

3 个答案:

答案 0 :(得分:4)

CREATE TRIGGER DataTrigger ON Data AFTER INSERT , DELETE
AS
BEGIN    
  INSERT INTO [dbo].[AuditTrail]
       ([ActionType]
       ,[TableName]
       ,[Name]
       ,[Time])
  SELECT 'INSERT'  
    ,'Data' 
    ,col1
    ,CURRENT_TIMESTAMP
  FROM Inserted

END

只是为了澄清。

您的查询,如果在插入多行时,如果语法正确将失败,则上述版本允许多次插入。

IF EXISTS是多余的,这就是它被移除的原因,如果没有行,则不会在审计表中插入。

如果您想审核DELETE,您需要再次使用类似的声明,但使用Deleted表而不是Inserted

要审核UPDATE,请为每个更新的行创建一个新的触发器,您在Inserted中获得包含新更新的条目,并在Deleted中使用旧数据获取条目,您可以如果你想追踪旧的和新的,请加入这些。

答案 1 :(得分:3)

CREATE TRIGGER DataTrigger ON Data AFTER INSERT , DELETE
AS
BEGIN

INSERT INTO [dbo].[AuditTrail]
       ([ActionType]
       ,[TableName]
       ,[Name]
       ,[Time])
SELECT 'INSERT', 'Data', col1, CURRENT_TIMESTAMP FROM Inserted

END

答案 2 :(得分:1)

我不完全确定你要在这里完成什么,所以我刚刚纠正了语法以使其工作,但它应该有所帮助。我也尝试过处理已删除的案例

CREATE TRIGGER DataTrigger 

ON Data 

AFTER INSERT , DELETE 
AS
BEGIN


    INSERT INTO [dbo].[AuditTrail]([ActionType],       
                                             [TableName],       
                                             [Name],       
                                             [Time])
    SELECT 'INSERT','Data', col1, CURRENT_TIMESTAMP
    FROM Inserted


    INSERT INTO [dbo].[AuditTrail]([ActionType],       
                                             [TableName],       
                                             [Name],       
                                             [Time])
    SELECT 'DELETE','Data', col1, CURRENT_TIMESTAMP
    FROM Deleted

END