如何使用sql server进行BEFORE UPDATED触发器?

Big*_*lls 41 sql database sql-server triggers sql-server-express

我正在使用Sqlserver express而且我无法做before updated触发器.还有另外一种方法吗?

ach*_*a99 39

MSSQL不支持BEFORE触发器.你最接近的是INSTEAD OF触发器,但它们的行为与BEFOREMySQL 中的触发器的行为不同.

您可以在此处了解有关它们的更多信息,并注意INSTEAD OF触发器"指定执行触发器而不是触发SQL语句,从而覆盖触发语句的操作." 因此,如果没有正确地写入/处理触发器,则可能不会发生对更新的动作.级联行动也会受到影响.

您可能希望使用不同的方法来实现您想要实现的目标.


小智 35

确实,MSSQL中没有"before triggers".但是,您仍然可以通过一起使用"inserted"和"deleted"表来跟踪对表进行的更改.当更新导致触发器触发时,"inserted"表存储新值,"deleted"表存储旧值.获得此信息后,您可以相对轻松地模拟"触发前"行为.

  • 这个答案对我有用; DELETED表保存原始值; INSERTED表保存新的/更新的值.AFTER UPDATE可以正常使用. (3认同)

Cha*_*ynt 10

无法确定这是否适用于SQL Server Express,但即使您的触发器在更新后发生,您仍然可以访问"之前"数据.您需要从更改表时动态创建的已删除或已插入表中读取数据.这基本上就是@Stamen所说的,但我还需要进一步探索,以了解(有用!)的答案.

删除过程中DELETE和UPDATE语句受影响的行的表存储副本.在执行DELETE或UPDATE语句期间,将从触发器表中删除行并将其传输到已删除的表...

插入过程中INSERT和UPDATE语句受影响的行的表存储副本.在插入或更新事务期间,新行将添加到插入的表和触发器表中...

https://msdn.microsoft.com/en-us/library/ms191300.aspx

因此,您可以创建触发器以从其中一个表中读取数据,例如

CREATE TRIGGER <TriggerName> ON <TableName>
AFTER UPDATE
AS
  BEGIN
    INSERT INTO <HistoryTable> ( <columns...>, DateChanged )
    SELECT <columns...>, getdate()
    FROM deleted;
  END;
Run Code Online (Sandbox Code Playgroud)

我的例子基于这里的一个:

http://www.seemoredata.com/en/showthread.php?134-Example-of-BEFORE-UPDATE-trigger-in-Sql-Server-good-for-Type-2-dimension-table-updates

  • 如果只是晚了7年.;-) (4认同)

Ian*_*son 9

T-SQL仅支持AFTER和INSTEAD OF触发器,它没有BEFORE触发器,如其他一些RDBMS中所见.

我相信你会想要使用INSTEAD OF触发器.