【问题标题】:SQL Server After Insert and After Update triggerSQL Server 插入后和更新后触发器
【发布时间】:2018-05-26 22:12:23
【问题描述】:

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

状态可以更改为活动、待定等。所以当每个状态发生变化时,我需要放置时间戳。对于每条新记录,我都需要添加新行。

这是表结构:

| 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

【问题讨论】:

  • 那么到目前为止,你写了什么作为触发器?你被困在哪里了?
  • 我只是做了简单的插入。我不知道我怎么能做到这一点。

标签: sql-server triggers


【解决方案1】:

嗯 - 你的触发器已经完成了一半。

假设Inserted 中只有一行 - 通常情况下不是!如果你的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

【讨论】:

  • 如果有人更新行怎么办。我也需要更新触发器
  • 当有人更新状态时。基于该状态,我需要将时间戳放在其他表中。例如活动状态更改为挂起。现在我想把时间戳放在其他表的待处理列中
  • @ROMA:好吧 - 使用我的插入触发器并根据更新情况对其进行调整 - 你也需要自己做一些事情!我们会提供帮助 - 但我们不只是为您的要求编写所有代码....
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-15
  • 1970-01-01
  • 1970-01-01
  • 2012-05-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多