触发器 - 插入审核,防止在活动表上更新

时间:2013-05-16 20:59:08

标签: sql-server-2008 triggers

首先发布在这里。

我想创建一个触发器,以便当有人尝试更新表时,它会阻止更新并将尝试记录在审计表中。

USE [AdventureWorks2008R2]
GO

SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
GO

ALTER TRIGGER [Person].[Lastname_Trigger]
ON [Person].[Person]
FOR UPDATE AS
       IF UPDATE (Lastname)
       BEGIN 
          INSERT INTO SurnameChange (BusinessEntityID, Firstname, OldLastName, NewLastName,AttemptedBy, Timestamped)
             SELECT
                d.businessentityid,
                i.firstname,
                d.lastname,
                i.lastname,
                SUSER_SNAME(),
                GETDATE()
             FROM deleted d , inserted i
             WHERE d.businessentityid = i.businessentityid
       END 

       /*This is where it is going wrong*/
       BEGIN TRANSACTION
          IF UPDATE(lastname)
          BEGIN
              RAISERROR ('cannot change lastname', 16, 1)
              ROLLBACK TRANSACTION
              RETURN
          END 

如果有人可以帮助我,那就太棒了,我已经使用AdventureWorks作为示例,因此它是通用的,可用于其他人。

非常感谢。

詹姆斯

1 个答案:

答案 0 :(得分:1)

试试这个:

SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
GO

ALTER TRIGGER [Person].[Lastname_Trigger]
ON [Person].[Person]
FOR UPDATE AS
       IF UPDATE (Lastname)
       BEGIN 
          INSERT INTO SurnameChange (BusinessEntityID, Firstname, OldLastName, NewLastName,AttemptedBy, Timestamped)
             SELECT
                d.businessentityid,
                i.firstname,
                d.lastname,
                i.lastname,
                SUSER_SNAME(),
                GETDATE()
             FROM deleted d
             INNER JOIN inserted i ON d.businessentityid = i.businessentityid

          RAISERROR ('cannot change lastname', 16, 1)
          ROLLBACK TRANSACTION
       END

       RETURN

如果LastName已更新,我认为没有任何理由(a)再次检查 ,(b)确实没有必要在触发器内启动事务。< / p>

由于您希望阻止实际发生UPDATE - 只需ROLLBACK已经进行中的事务(对于{{1}命令)并完成它。

附注:请升级您的SQL专有技术以适应“新”正确的ANSI SQL UPDATE语法(使用SQL引入 20多年前 -92标准) - 使用JOININNER JOIN等并停止使用以逗号分隔的表格列表