插入后和更新后的SQL Server触发器

时间:2017-12-13 05:16:11

标签: sql-server triggers

我需要在插入后和更新后触发器创建。如果新行插入表中,它应该在插入触发器之后运行并将时间戳放在其他表中。但是如果再次编辑该行,它也应该更新另一个表。

状态可以更改为活动状态,待处理状态等。因此,当每个状态发生变化时,我需要输入时间戳。而对于每一个新纪录,我都需要投入新的一排。

这是表结构:

| ID | Name | Status |
|----|------|--------|
| 1  | xyz  | Active |
|    |      |        |
|    |      |        |

假设这是插入表中的新行,因此应将其插入另一个表中。但是当我更改其状态时,它应该根据此ID更新另一个表。

| ID | Name | Active Staus | Other Status |
|----|------|--------------|--------------|
| 1  | xyz  | TimeStamp    | Time Stamp   |
|    |      |              |              |
|    |      |              |              |`


 USE [DemoDB]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[test_INSERT]
       ON [dbo].[Demo]
AFTER INSERT
AS
BEGIN
       SET NOCOUNT ON;

       DECLARE ID BIGINT
       Declare @status varchar(50)
       SELECT @ID = INSERTED.ID 

       FROM INSERTED

       INSERT INTO [dbo].[LogTble]
       VALUES(@ID,'timestamp')
END

1 个答案:

答案 0 :(得分:0)

嗯 - 你的触发器就在那里。

假设 Inserted中只有一行 - 这通常就是 NOT !如果您的INSERT语句插入多行,Inserted中会有多个条目,代码如下:

  SELECT @ID = INSERTED.ID FROM INSERTED

会悲惨地失败......你会选择一个仲裁行 - 而其他所有行都会被忽略....

您需要注意Inserted 将包含多行,您需要相应地编写触发器 - 以基于集合的方式。

试试这个:

ALTER TRIGGER [dbo].[test_INSERT]
ON [dbo].[Demo]
AFTER INSERT
AS
BEGIN
    SET NOCOUNT ON;

    INSERT INTO [dbo].[LogTble] (Id, ActiveStatus)
        SELECT i.ID, SYSDATETIME()
        FROM Inserted i
END