Триггер для обновления другого поля в той же таблице - PullRequest
0 голосов
/ 23 сентября 2011

Я хочу запустить триггер, когда я обновляю определенное поле в базе данных, поэтому он обновляет другое поле (в основном у нас есть 2 разных уникальных идентификатора для каждой записи, поэтому, когда один из них изменяется, нам нужно обновить и другое -ууу!)

CREATE OR REPLACE TRIGGER trigger_name ON table AFTER
  UPDATE AS
  UPDATE table A
  SET unique_to_update = NVL(
    (SELECT b.unique_to_update_from
    FROM table b
    WHERE B.other_unique_id = A.unique_id_to_match
    ), 0);

Понятия не имею, сработает ли это (честно говоря, боюсь это проверить, поскольку я уверен, что это сломает вещи), и даже если это сработает, оно продолжитсякаждое обновление этой таблицы, а не только одно поле, которое я хотел.

Любая помощь будет принята с благодарностью, спасибо!

Ответы [ 2 ]

2 голосов
/ 23 сентября 2011

Протестируйте что-нибудь, прежде чем запускать в производство.

Что-то вроде этого должно быть вашим курком:

CREATE OR REPLACE TRIGGER trigger_name  
BEFORE UPDATE of unique_id_to_match
ON table
FOR EACH ROW
AS
BEGIN
  select 
    NVL(
      (SELECT b.unique_to_update_from
      FROM table b
      WHERE B.other_unique_id = :new.unique_id_to_match
      ), 0)
   into :new.unique_to_update 
   FROM dual;
END;
0 голосов
/ 23 сентября 2011

5000 строк х 900 столбцов не так уж и много :) Я боялся, что он имеет 10M строк:)

ОК, старт

create temporary table tmp_my_important_columns on commit delete rows 
as 
select unique_id_to_match, unique_to_update_from, 
       other_unique_id , unique_to_update 
from table where rownum < 1;

второй

CREATE OR REPLACE TRIGGER trigger_before_upd_stmt
BEFORE UPDATE
ON table
AS
BEGIN
insert into 
tmp_my_important_columns 
select unique_id_to_match, unique_to_update_from, 
       other_unique_id , unique_to_update 
from table;
END;

третий,

CREATE OR REPLACE TRIGGER trigger_name  
BEFORE UPDATE of unique_id_to_match
ON table
FOR EACH ROW
AS
BEGIN
  select 
    NVL(
      (SELECT b.unique_to_update_from
      FROM tmp_my_important_columns b
      WHERE B.other_unique_id = :new.unique_id_to_match
      ), 0)
   into :new.unique_to_update 
   FROM dual;
END;

Комментарии:

  • После обновления, если вы обновите те же строки снова, без фиксации (который удаляет таблицу tmp), вы получите проблемы. Итак, или вы делаете после обновления, или вы можете добавить триггер после обновления (без каждой строки), который удаляет все из таблицы tmp, но это несколько уродливо.
  • Вы можете добавить индексы для временной таблицы.
...