代码之家  ›  专栏  ›  技术社区  ›  Bigballs

如何使用sql server执行更新前触发器?

  •  36
  • Bigballs  · 技术社区  · 17 年前

    我正在使用SQLServerExpress,但无法执行此操作 before updated

    7 回复  |  直到 17 年前
        1
  •  43
  •   hardkoded    9 年前

    MSSQL不支持 BEFORE 触发器。最接近你的是 INSTEAD OF 触发器,但它们的行为与 之前

    here ,请注意 而不是 触发器“指定执行触发器而不是触发SQL语句,从而覆盖触发语句的操作。”因此,如果未正确写入/处理触发器,则可能不会执行更新操作。级联操作也会受到影响。

        2
  •  43
  •   Stamen    15 年前

    MSSQL中确实没有“前触发器”。但是,您仍然可以通过同时使用“插入”表和“删除”表来跟踪对表所做的更改。当更新导致触发时,“插入”表存储新值,“删除”表存储旧值。一旦有了这些信息,您就可以相对容易地模拟“触发前”行为。

        3
  •  14
  •   Charlie Joynt S. Barij    10 年前

    无法确定这是否应用于SQL Server ,但即使触发器发生在更新之后,您仍然可以访问“before”数据。您需要从以下任一位置读取数据: 删除

    这个 表存储删除和删除期间受影响行的副本 更新语句。在执行删除或更新期间 语句,则从触发器表中删除行并将其传输到

    这个 表存储插入期间受影响行的副本 行同时添加到插入表和触发器表中。。。

    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;
    

    我的示例基于以下示例:

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

        4
  •  9
  •   Ian Nelson    17 年前

    T-SQL只支持AFTER触发器,而不支持BEFORE触发器,这与其他一些RDBMS中的触发器不同。

        5
  •  4
  •   Tomalak    17 年前

    要在更新之前执行某些操作,请签出 INSTEAD OF UPDATE Triggers

        6
  •  2
  •   ThinkingStiff    13 年前

    BEFORE UPDATE 在SQL Server中,我使用了一个技巧。我对记录做了错误的更新( UPDATE Table SET Field = Field ),这样我就得到了记录的前一张图像。

        7
  •  1
  •   mkj java seeker    9 年前

    请记住,当您使用instead触发器时,除非您在触发器中明确告诉它,否则它不会提交insert。而不是真正的意思是这样做,而不是像通常那样做,这样就不会发生任何正常的插入操作。

        8
  •  0
  •   Jean-François Fabre    7 年前

    完整示例:

    CREATE TRIGGER [dbo].[trig_020_Original_010_010_Gamechanger]
       ON  [dbo].[T_Original]
       AFTER UPDATE
    AS 
    BEGIN
        -- SET NOCOUNT ON added to prevent extra result sets from
        -- interfering with SELECT statements.
        SET NOCOUNT ON;
        DECLARE @Old_Gamechanger int;
        DECLARE @New_Gamechanger int;
    
        -- Insert statements for trigger here
        SELECT @Old_Gamechanger = Gamechanger from DELETED;
        SELECT @New_Gamechanger = Gamechanger from INSERTED;
    
        IF @Old_Gamechanger != @New_Gamechanger
    
            BEGIN
    
                INSERT INTO [dbo].T_History(ChangeDate, Reason, Callcenter_ID, Old_Gamechanger, New_Gamechanger)
                SELECT GETDATE(), 'Time for a change', Callcenter_ID, @Old_Gamechanger, @New_Gamechanger
                    FROM deleted
                ;
    
            END
    
    END
    
        9
  •  0
  •   Lenin    6 年前

    更新或删除的值存储在 . 我们可以在触发器中通过以下方法获得它

    举个例子,

    CREATE TRIGGER PRODUCT_UPDATE ON PRODUCTS
    FOR UPDATE 
    AS
    BEGIN
    DECLARE @PRODUCT_NAME_OLD VARCHAR(100)
    DECLARE @PRODUCT_NAME_NEW VARCHAR(100)
    
    SELECT @PRODUCT_NAME_OLD = product_name from DELETED
    SELECT @PRODUCT_NAME_NEW = product_name from INSERTED
    
    END