我想做的事情似乎相对简单。我有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,我相信已经设置好了。有人可以在这里指出正确的方向吗?
非常感谢您!
答案 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
?)