【问题标题】:How can I create a trigger that adds a record to a different table when a record is changed on my source table?当源表上的记录发生更改时,如何创建将记录添加到不同表的触发器?
【发布时间】:2018-09-10 19:01:46
【问题描述】:

我想做的事情似乎比较简单。我有 2 张桌子,[ideas] 和 [my_projects]。我正在寻找的是一个触发器,当创意状态的状态更改为“关闭”时,它将把创意中的记录添加到 my_projects 中。 这是我的表:

CREATE TRIGGER triggerNEWPROJECT ON IDEAS
AFTER INSERT, UPDATE
AS 
DECLARE 
@ID varchar(255), @NEW_STATUS varchar(255), @NEW_NAME varchar(255), @OLD_STATUS varchar(255);
SET @ID = IDEAS.ID;
SET @NEW_STATUS = 'NEW';
set @NEW_NAME = new.NAME
set @OLD_STATUS = (SELECT STATUS FROM IDEAS WHERE ID = @ID)
BEGIN
if @OLD_STATUS = 'closed'
    INSERT INTO MY_PROJECTS (IDEA_ID, STATUS) VALUES(@ID, @NEW_NAME, @NEW_NAME);
END;

当创意状态更新为“已关闭”时,我希望它创建一个与刚刚关闭的创意同名的项目,但 My_Projects 表中的状态为“新建”。 这似乎应该很容易,但它不起作用,而且我很清楚我不知道我在做什么。 这是我的触发代码:

CREATE TRIGGER triggerNEWPROJECT ON IDEAS
AFTER INSERT, UPDATE
AS 
DECLARE 
@ID varchar(255), @NEW_STATUS varchar(255), @NEW_NAME varchar(255), @OLD_STATUS varchar(255);
SET @ID = IDEAS.ID;
SET @NEW_STATUS = 'NEW';
set @NEW_NAME = new.NAME
set @OLD_STATUS = (SELECT STATUS FROM IDEAS WHERE ID = @ID)
BEGIN

    INSERT INTO MY_PROJECTS (IDEA_ID, STATUS) VALUES(@ID, @NEW_NAME, @NEW_NAME);
END;

我希望 Projects 表中的 ID 字段仅为 auto_increment,并且我相信我已将其设置为这样做。谁能在这里指出我正确的方向?

非常感谢!

【问题讨论】:

  • 你需要查看插入和删除的虚拟表。您的触发器也有一个主要问题。假设只有一行将被更新。触发器每次操作触发一次,而不是每行一次,您需要处理它。这是一个很好的起点。 spaghettidba.com/2015/04/24/…
  • 当部分规则声明状态正在更改为“关闭”时,不确定为什么要在此处使用插入触发器。它不可能在插入时发生变化,因为它还不存在。
  • (IDEA_ID, STATUS) VALUES (@ID, @NEW_NAME, @NEW_NAME):两列,三个值,Status 永远是'closed'?

标签: sql sql-server tsql triggers


【解决方案1】:

SQL Server 有一个非常方便的表inserted,它存在于insert/update 触发器的事务时间内。 inserted 表中的记录将是您在IDEAS 中插入或更新的新记录。

你可以这样使用它:

CREATE TRIGGER triggerNEWPROJECT ON IDEAS
FOR INSERT, UPDATE
AS 
BEGIN
    INSERT INTO MY_PROJECTS (IDEA_ID, STATUS, NAME) 
    SELECT new.ID, 'New', new.Name
    FROM inserted new
    LEFT JOIN deleted old on new.ID = old.id
    WHERE old.status <> 'closed'
    AND new.status = 'closed'
END

您当前的触发器有点令人困惑,但这应该与您要查找的内容接近。根据需要调整列名(例如,项目名称是否=name?)

【讨论】:

  • 需要添加对状态为“关闭”的检查。
  • @SeanLange 谢谢肖恩,已添加
  • 你为什么加入IDEAS?如果您想删除您加入的更改值。
  • @SeanLange deleted 是否存在插入?尽管我同意您对似乎只是更新的问题的评论,但无论如何我的触发器都是考虑到这一点的。
  • Nvm,刚刚尝试过,deleted 存在,在这种情况下它只是空的。感谢您的建议
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-01-16
  • 2015-07-11
  • 1970-01-01
  • 2015-12-08
  • 2011-03-06
  • 2013-11-17
相关资源
最近更新 更多