【问题标题】:Trigger - Insert into audit, prevent update on live table触发器 - 插入审计,防止更新活动表
【发布时间】:2013-05-16 20:59:08
【问题描述】:

第一次发帖。

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

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 作为示例,因此它对其他人来说是通用且可用的。

非常感谢。

詹姆斯

【问题讨论】:

  • INSTEAD OF trigger 在这里可能更容易;顾名思义,无论您在触发器中放置什么,都会运行而不是触发动作,因此根本不会执行原始的INSERT

标签: sql-server-2008 triggers


【解决方案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) 确实不需要在触发器内启动事务。

既然您想防止实际的UPDATE 发生 - 只需ROLLBACK 已经进行中的事务(对于UPDATE 命令)并完成了。

附注:请将您的 SQL 知识升级到“新的”正确的 ANSI SQL JOIN 语法(20 多年前在 SQL-92 中引入标准)- 使用 INNER JOINLEFT OUTER JOIN 等并停止使用逗号分隔的表格列表

【讨论】:

  • 谢谢!我知道这会很简单。
  • 没问题。还是习惯了这个网站,所以谢谢你指出我应该再发一次。
猜你喜欢
  • 1970-01-01
  • 2021-09-05
  • 2020-11-07
  • 2021-05-20
  • 2017-04-26
  • 1970-01-01
  • 2011-05-14
  • 1970-01-01
  • 2017-10-08
相关资源
最近更新 更多