【发布时间】:2018-09-10 19:01:46
【问题描述】:
我想做的事情似乎比较简单。我有 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;
当创意状态更新为“已关闭”时,我希望它创建一个与刚刚关闭的创意同名的项目,但 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,并且我相信我已将其设置为这样做。谁能在这里指出我正确的方向?
非常感谢!
【问题讨论】:
-
你需要查看插入和删除的虚拟表。您的触发器也有一个主要问题。假设只有一行将被更新。触发器每次操作触发一次,而不是每行一次,您需要处理它。这是一个很好的起点。 spaghettidba.com/2015/04/24/…
-
当部分规则声明状态正在更改为“关闭”时,不确定为什么要在此处使用插入触发器。它不可能在插入时发生变化,因为它还不存在。
-
(IDEA_ID, STATUS) VALUES (@ID, @NEW_NAME, @NEW_NAME):两列,三个值,Status永远是'closed'?
标签: sql sql-server tsql triggers