【问题标题】:Insert or Update only Particular Record using Trigger使用触发器仅插入或更新特定记录
【发布时间】:2019-07-06 23:49:49
【问题描述】:

如果表 A 中有任何更新/插入,我正在尝试将记录插入表 B。触发器应仅将插入语句中的记录插入表 A 中的所有表记录,而不是将表 A 中的所有表记录插入表 B。您的帮助非常高赞赏。

代码工作正常,但它试图在表 A 中插入所有记录,而不是仅插入特定记录。

CREATE TRIGGER TestTrigger  
ON dbo.Test 
FOR INSERT,update 
as

  insert into dbo.TestBKP(ID, LastName, FirstName, Age, updatetime)
    select ID, LastName, FirstName, Age, getdate()
    from Test

  print 'Row Inserted';

GO

insert into dbo.Test values(1,'AAA','BBB',24)

期待

dbo.TestBKP 表应该只包含上述插入值,而不是dbo.Test 值中的所有数据。

【问题讨论】:

  • from Test 更改为 from Inserted
  • 你应该使用inserted伪表。
  • 您正在使用table Atable B,但它不包含在您的代码中。
  • 感谢@DaleBurrell 的评论,它帮助我解决了我的问题。
  • 感谢@HoneyBadger 的回复。

标签: sql-server tsql azure-sql-database database-trigger


【解决方案1】:

当使用触发器(以及SELECTMERGE 语句上的OUTPUT 子句)时,有一个名为inserted 的特殊关键字表,它保存正在插入或更新的跟踪表的记录。如果您只想使用这些记录而不是整个跟踪表,则需要引用此表,例如 (FROM dbo.Test)。

CREATE TRIGGER TestTrigger ON dbo.Test 
    FOR INSERT, UPDATE
AS
BEGIN

    insert into dbo.TestBKP (
        ID, 
        LastName, 
        FirstName, 
        Age, 
        updatetime)
    select 
        ID, 
        LastName, 
        FirstName, 
        Age, 
        getdate()
    from 
        inserted AS I -- This "inserted" table is a copy of dbo.Test with only new/updated records

    print 'Row Inserted';

END

在编写UPDATEDELETE 触发器时,还有另一个名为deleted 的关键字特殊表保存已删除的行(当由DELETE 触发时)或更新行的旧版本(当由UPDATE)。

【讨论】:

    【解决方案2】:

    只需在 select 语句中将 Test 替换为 Inserted

    CREATE TRIGGER TestTrigger ON dbo.Test
    FOR INSERT
    AS
         INSERT INTO dbo.TestBKP
         (ID, 
          LastName, 
          FirstName, 
          Age, 
          updatetime
         )
                SELECT ID, 
                       LastName, 
                       FirstName, 
                       Age, 
                       GETDATE()
                FROM **inserted**;
         PRINT 'Row Inserted';
    GO
    
    INSERT INTO dbo.Test
    VALUES
    (1, 
     'AAA', 
     'BBB', 
     24
    );
    

    【讨论】:

      猜你喜欢
      • 2013-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-24
      • 1970-01-01
      相关资源
      最近更新 更多