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

Sql 当源表上的记录发生更改时,如何创建将记录添加到其他表的触发器?,sql,sql-server,tsql,triggers,Sql,Sql Server,Tsql,Triggers,我想做的事情似乎相对简单。我有两张表格,[想法]和[我的项目]。我要寻找的是一个触发器,当idea状态更改为“已关闭”时,它会将idea的记录添加到我的_项目中。 这是我的桌子: CREATE TRIGGER triggerNEWPROJECT ON IDEAS AFTER INSERT, UPDATE AS DECLARE @ID varchar(255), @NEW_STATUS varchar(255), @NEW_NAME varchar(255), @OLD_STATUS varc

我想做的事情似乎相对简单。我有两张表格,[想法]和[我的项目]。我要寻找的是一个触发器,当idea状态更改为“已关闭”时,它会将idea的记录添加到我的_项目中。 这是我的桌子:

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字段只是自动递增,我相信我已经设置好了。有人能给我指一下正确的方向吗


多谢各位

SQL Server有一个非常方便的表
insert
,它存在于
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
CREATE triggerNEWPROJECT ON IDEAS
对于插入,请更新
像
开始
插入我的项目(想法ID、状态、名称)
选择new.ID、'new',new.Name
从插入的新
LEFT JOIN deleted old on new.ID=old.ID
其中旧的。状态“已关闭”
和new.status='closed'
终止

您当前的触发器有点混乱,但这应该接近您所寻找的。根据需要调整列名(例如,is project name=
name
?)

您需要查看插入和删除的虚拟表。你的扳机也有一个大问题。假设只更新一行。每次操作触发一次fire,而不是每行触发一次,您需要处理它。这是一个很好的起点。当部分规则声明状态正在更改为“已关闭”时,不确定为什么要在此处使用插入触发器。它不可能在插入时更改,因为它还不存在。
(IDEA\u ID,STATUS)值(@ID,@NEW\u NAME,@NEW\u NAME)
:两列,三个值,
状态将始终是
'closed'
?需要添加状态为“closed”的检查。@SeanLange谢谢Sean,补充:你为什么要加入IDEAS?如果要删除所加入的更改值。@SeanLange是否存在插入的
deleted
?虽然我同意你对这个问题的评论,似乎这只是更新,我的触发器是用这个想法写的。Nvm,刚刚尝试过,并且
删除了
存在,在这种情况下它只是空的。谢谢你的建议