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

问题描述 投票:-1回答:1

我想做的事情似乎相对简单。我有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;

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

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,我相信我已经设置了这样做。任何人都能指出我在正确的方向吗?

非常感谢你!

sql sql-server tsql triggers
1个回答
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?)

© www.soinside.com 2019 - 2024. All rights reserved.