у меня есть две таблицы
Порядок (идентификатор, дата, отмечают),
и
Доставка (идентификатор, примечание, дата)
Я хочу создать триггер, который обновляет дату в Доставке, когда дата обновляется в порядке.
Я думал, чтобы сделать что-то как
CREATE OR REPLACE TRIGGER your_trigger_name
BEFORE UPDATE
ON Order
DECLARE
BEGIN
UPDATE Delivery set date = ??? where id = ???
END;
Как я получаю идентификатор строки и дата?
спасибо
Как мне получить дату и идентификатор строки?
Предполагая, что это столбцы в вашей таблице 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 кажется логичным местом для него.
При необходимости для такого триггера внимательно посмотрите на свой дизайн. Действительно ли нужна отдельная запись о доставке? Действительно ли в заказе больше одной доставки?
Триггеры кажутся хорошими, но они довольно быстро все портят.
Используйте переменные связывания СТАРЫЙ и НОВЫЙ. 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
.
В триггере есть неявная новая и старая ссылка в форме: ССЫЛКА НА СТАРЫЙ КАК СТАРЫЙ НОВЫЙ КАК НОВЫЙ
Вы можете записывать в значение: 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;