使用触发器仅插入或更新特定记录

问题描述 投票:0回答:2

如果表A中有任何更新/插入,我试图将记录插入表B.触发器应该只插入insert语句中的记录而不是表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值中的所有数据。

sql-server tsql azure-sql-database database-trigger
2个回答
1
投票

当使用触发器(以及OUTPUTSELECT语句上的MERGE子句)时,会有一个名为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触发时)。


0
投票

只需将Select替换为select语句中的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
);
© www.soinside.com 2019 - 2024. All rights reserved.