您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

创建用于插入,修改和删除的数据库触发器的正确??语法是什么

创建用于插入,修改和删除的数据库触发器的正确??语法是什么

最简单的方法可能只是简单地创建三个触发器-每个操作一个

CREATE TRIGGER trgUserInsert
ON dbo.User AFTER INSERT
AS BEGIN
   INSERT INTO dbo.UserHistory............
END

CREATE TRIGGER trgUserDelete
ON dbo.User AFTER DELETE
AS BEGIN
   INSERT INTO dbo.UserHistory............
END

CREATE TRIGGER trgUserUpdate
ON dbo.User AFTER UPDATE
AS BEGIN
   INSERT INTO dbo.UserHistory............
END

这样,事情就很简单,您可以轻松地了解自己在做什么,如果您需要插入或删除大量项目,它还可以关闭单个操作的触发器。

在触发器内部,您有两个“伪表”-Inserted(用于INSERT和UPDATE)和Deleted(用于UPDATE和DELETE)。这些伪表包含新插入值(或UPDATE中更新的值)的值,或已删除(对于DELETE)或已更新的值(对于UPDATE操作,在更新之前的旧值)的值。

你需要知道,如果你更新行,如数量庞大的触发将有一次甚至被称为Inserted以及Deleted通常包含多个行。

作为示例,您可以像这样编写“ AFTER INSERT”触发器(只是猜测您的表结构可能是…。):

CREATE TRIGGER trgUserInsert
ON dbo.User AFTER INSERT
AS BEGIN
   INSERT INTO 
      dbo.UserHistory(UserID, Action, DateTimeStamp, AuditMessage)
      SELECT 
         i.UserID, 'INSERT', getdate(), 'User inserted into table'
      FROM
         Inserted i
END

您正在寻找一种方法来找出此触发器引起的“动作”吗?我看不到有任何方法可以做到,这是将三个触发器分开的另一个原因。找出这一点的唯一方法是对InsertedUpdated表中的行进行计数:

您还正在寻找“已更新的字段列表”-再次,您实际上将没有任何简单的解决方案。您可以只浏览“用户”表中感兴趣的字段,然后检查

IF UPDATE(fieldname) ......

但这有点乏味。

或者,您可以使用该COLUMNS_UPDATED()函数- 但是,该函数不能为您提供很好的列名列表,而是一个VARBINARY,其中每个列基本上都是一位,并且如果打开了该列,则该列也将被更新。不是很容易使用.....

如果您确实要创建一个大型触发器,则可以以此为基础-它检测导致触发器触发的操作,并将条目插入到User_History表中:

CREATE TRIGGER trgUser_Universal
ON dbo.Users
AFTER INSERT, UPDATE, DELETE
AS BEGIN
  DECLARE @InsHasRows BIT = 0
  DECLARE @DelHasRows BIT = 0

  IF EXISTS(SELECT TOP 1 * FROM INSERTED)
    SET @InsHasRows = 1

  IF EXISTS(SELECT TOP 1 * FROM DELETED)
    SET @DelHasRows = 1

  DECLARE @TriggerAction VARCHAR(20)

  IF @InsHasRows = 1 AND @DelHasRows = 1 
     SET @TriggerAction = 'UPDATE'
  ELSE
     IF @InsHasRows = 1
        SET @TriggerAction = 'INSERT'
     ELSE  
        SET @TriggerAction = 'DELETE'

  IF @InsHasRows = 1
    INSERT INTO dbo.UsersHistory(user_id, [action], [fields], timestamp)
      SELECT i.UserId, @TriggerAction, null, getdate()
      FROM INSERTED i
  ELSE  
    INSERT INTO dbo.UsersHistory(user_id, [action], [fields], timestamp)
      SELECT d.UserId, @TriggerAction, null, getdate()
      FROM DELETED d
END

我还没有弄清楚哪些字段已经更新过了-留给读者练习:-)

这些帮助有用?

其他 2022/1/1 18:36:44 有363人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶