【问题标题】:Create a trigger that inserts old values into other table when a row is updated创建一个触发器,在更新行时将旧值插入其他表
【发布时间】:2015-03-10 06:34:30
【问题描述】:

我正在尝试在 SQL Server 数据库上实现一个触发器,只要在 table1 中更新一行,它就会在 table2 中插入一个新行。我想在更新前获取行数据(table1)。

例如,我有以下几行:

 table1:                          table2:
 ________________________         ________________________
 |  id       |    name  |         |  id    |     name    |
 ________________________         ________________________
 |   1       |    John  |         
 ------------------------         

目前我正在使用以下触发器-

CREATE TRIGGER triggername
ON table1
FOR UPDATE
AS
Begin
  INSERT INTO table2(name) 
     SELECT i.name 
     FROM Inserted i
End

此触发器正在执行以下操作 -

 table1:                          table2:
 ________________________         ________________________
 |  id       |    name  |         |  id    |     name    |
 ________________________         ________________________
 |   1       |    Alex  |         |   1    |      Alex   |
 ------------------------         ------------------------

但我想要 table2 中的“John”。比如table1和table2现在应该如下-

 table1:                          table2:
 ________________________         ________________________
 |  id       |    name  |         |  id    |     name    |
 ________________________         ________________________
 |   1       |    Alex  |         |   1    |      John   |
 ------------------------         ------------------------

我该怎么做?

【问题讨论】:

    标签: sql sql-server triggers


    【解决方案1】:

    您需要在触发器中使用Deleted 伪表,其中包含 值(在UPDATE 之前):

    CREATE TRIGGER triggername
    ON table1
    FOR UPDATE
    AS
    Begin
      INSERT INTO table2(name) 
         SELECT d.name 
         FROM Deleted d
    End
    

    Inserted 伪表包含 值 - 在 UPDATE 之后。

    【讨论】:

      【解决方案2】:

      这只会返回新值:

      INSERT INTO table2(name) 
      SELECT i.name 
      FROM Inserted i
      

      然而,这将返回更新前的值

      INSERT INTO table2(name) 
      select d.name
      from inserted i
        join deleted d
          on (i.id = d.id)
      

      【讨论】:

        【解决方案3】:

        使用以下-

         Begin
           INSERT INTO table2(name) 
           SELECT d.name 
           FROM Deleted d
         End
        

        【讨论】:

          猜你喜欢
          • 2023-03-31
          • 2012-04-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-01-25
          • 2020-08-23
          • 1970-01-01
          • 2021-12-25
          相关资源
          最近更新 更多