Создайте триггер, который обновляет столбец на одной таблице, когда столбец в другой таблице обновляется

у меня есть две таблицы

Порядок (идентификатор, дата, отмечают),

и

Доставка (идентификатор, примечание, дата)

Я хочу создать триггер, который обновляет дату в Доставке, когда дата обновляется в порядке.

Я думал, чтобы сделать что-то как

CREATE OR REPLACE TRIGGER your_trigger_name
BEFORE UPDATE
ON Order
DECLARE
BEGIN
   UPDATE Delivery set date = ??? where id = ???
END;

Как я получаю идентификатор строки и дата?

спасибо

16
задан APC 21 April 2010 в 04:00
поделиться

4 ответа

Как мне получить дату и идентификатор строки?

Предполагая, что это столбцы в вашей таблице ORDER с именем DELIVERY_DATE и идентификатор, ваш триггер должен выглядеть примерно так:

CREATE OR REPLACE TRIGGER your_trigger_name
    BEFORE UPDATE ON Order
    FOR EACH ROW 
BEGIN
   if :new.delivery_date != :old.delivery_date
   then
       UPDATE Delivery d
       set d.delivery_date = :new.delivery_date
       where d.order_id = :new.id;
    end if;
END;

Обратите внимание на предложение FOR EACH ROW: оно необходимо для ссылочные значения из отдельных строк. Я использовал конструкцию IF, чтобы проверить, выполнять ли UPDATE при доставке. Если у вас нет другой логики в вашем триггере, вы можете написать это так ...

CREATE OR REPLACE TRIGGER your_trigger_name
    BEFORE UPDATE OF delivery_date ON Order
    FOR EACH ROW 
BEGIN
   UPDATE Delivery d
   set d.delivery_date = :new.delivery_date
   where d.order_id = :new.id;
END;

Я ответил на ваш вопрос, но, в стороне, отмечу, что ваша модель данных неоптимальна. Правильно нормализованный дизайн будет содержать DELIVERY_DATE только в одной таблице: DELIVERY кажется логичным местом для него.

17
ответ дан 30 November 2019 в 22:37
поделиться

При необходимости для такого триггера внимательно посмотрите на свой дизайн. Действительно ли нужна отдельная запись о доставке? Действительно ли в заказе больше одной доставки?

Триггеры кажутся хорошими, но они довольно быстро все портят.

0
ответ дан 30 November 2019 в 22:37
поделиться

Используйте переменные связывания СТАРЫЙ и НОВЫЙ. OLD ссылается на строку или столбец, обновляемые перед внесением изменения; NEW ссылается на него после изменения.

CREATE OR REPLACE TRIGGER trig1
    BEFORE UPDATE
    ON order  REFERENCING NEW AS new
    FOR EACH ROW
BEGIN
    UPDATE delivery
       SET ddate   = :new.ddate
     WHERE id = :new.id;
END;

Вы можете изменить предложение REFERENCING , чтобы присвоить вашим переменным связывания разные имена. Вы также можете включить OLD как <имя> . Пример:

CREATE OR REPLACE TRIGGER trig1
    BEFORE UPDATE
    ON order REFERENCING OLD AS old_values NEW AS new_values
    ...

Если вы не хотите изменять имена по умолчанию «старый» и «новый», вы можете полностью опустить предложение REFERENCING .

0
ответ дан 30 November 2019 в 22:37
поделиться

В триггере есть неявная новая и старая ссылка в форме: ССЫЛКА НА СТАРЫЙ КАК СТАРЫЙ НОВЫЙ КАК НОВЫЙ

Вы можете записывать в значение: NEW, но не в: СТАРАЯ ценность.

UPDATE Delivery set date = :new.delivery_date where id = :new.id;


CREATE OR REPLACE TRIGGER "BUR_TABLENAME" BEFORE
UPDATE ON "TABLE" FOR EACH ROW
BEGIN
  If :new.active_date is not null Then
    :new.active_date := TRUNC(:new.active_date);
End If;
END;

Шаблон:

CREATE OR REPLACE TRIGGER TRIGGER_NAME
 BEFORE
 UPDATE
 ON TABLE_NAME
 REFERENCING OLD AS OLD NEW AS NEW
 FOR EACH ROW
DECLARE
   V_VARIABLE   NUMBER (1);
BEGIN
   //Do Stuff;
  null;
end;
0
ответ дан 30 November 2019 в 22:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: