在源表上更改记录时,如何创建将记录添加到其他表的触发器?

时间:2018-09-10 19:01:46

标签: sql sql-server tsql triggers

我想做的事情似乎相对简单。我有2个表,[想法]和[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,我相信已经设置好了。有人可以在这里指出正确的方向吗?

非常感谢您!

1 个答案:

答案 0 :(得分: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?)