Как я могу создать триггер, который добавляет запись в другую таблицу, когда запись изменяется в моей исходной таблице? - PullRequest
0 голосов
/ 10 сентября 2018

То, что я хочу сделать, кажется относительно простым. У меня есть 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;

Я бы хотел, чтобы поле ID в таблице Projects было просто auto_increment, и я считаю, что настроил его для этого. Кто-нибудь может указать мне правильное направление здесь?

Большое спасибо!

1 Ответ

0 голосов
/ 10 сентября 2018

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?)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...