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