2013-02-09 3 views
1

Я использую SQL и базу данных Oracle и нуждаюсь в помощи - триггеры - это то, что я пытаюсь понять.PL/SQL Trigger для обновления другой таблицы из INSERT в одной таблице

Мне нужен триггер, когда я вставляю строку в таблицу A, чтобы она обновляла строку в таблице B: в частности, строка, первичный ключ которой соответствует соответствующему внешнему ключу строки, которая была добавлена ​​в таблицу A.

Так, например, столбец X в таблице A является внешним ключом, который ссылается на столбец Y в таблице B (первичный ключ). Когда я добавляю строку в таблицу AI, необходимо, чтобы столбец Z таблицы B имел 1 добавленный к его числовому значению в строке, где столбец X = столбец Y.

Это то, что я смог получить до сих пор на основе SQL на моем ограниченном понимании триггеров, в случае, если это помогает (я понимаю, что это не очень хорошо, относиться к ней как псевдокод):

CREATE OR REPLACE TRIGGER test_trig 
AFTER INSERT OR UPDATE ON tableA 
FOR EACH ROW 

BEGIN 
    UPDATE tableB 
    SET columnZ = columnZ + 1 
    WHERE tableA.columnX = tableB.columnY; 
END test_trig; 
/

Благодаря

ответ

0

достаточно хорошо начать.

первый - давайте сделаем это в стороне - это не очень хорошо нормируется - значение, которое вы описываете, похоже, должно быть рассчитано во время выполнения, а не во время манипулирования данными.

рассмотреть следующие вопросы:

вставки = +1 к колонку - ок

обновления =? не всегда +1 к столбцу, я полагаю, вероятно, только когда некоторые другие данные будут изменены. например - что, если я обновляю таблицу, установите col1 = col1. возможно, то, что вы хотите, возможно, нет.

delete =? удаляет среднее значение -1 в столбец?

синтаксис:

WHERE tableA.columnX = tableB.columnY; 

должен быть

WHERE :new.columnX = tableB.columnY; 
1

попробовать это:

Синтаксис будет

CREATE OR REPLACE TRIGGER test_trig 
AFTER INSERT OR UPDATE ON tableA 
FOR EACH ROW 

BEGIN 
    UPDATE tableB 
    SET columnZ = columnZ + 1 
    WHERE tableB.columnX = :NEW.columnX; 
END test_trig; 
/

: new.columnX ссылки на таблицу columnX.

0

Если tableB.columnZ представляет собой счет ссылочных записей таблицы A, то нет смысла запускать UPDATE таблицыAA, если столбец таблицы таблицы не изменится.

Первый OCASION: tableA.ReferenceColumn не меняется:

CREATE OR REPLACE TRIGGER test_trig 
AFTER INSERT ON tableA 
FOR EACH ROW 
BEGIN 

    UPDATE tableB 
    SET columnZ = columnZ + 1 
    WHERE tableB.columnX = :NEW.columnX; 
END test_trig; 
/

Второй OCASION: tableA.ReferenceColumn делает изменение:

CREATE OR REPLACE TRIGGER test_trig 
AFTER INSERT OR UPDATE OF columnX ON tableA 
FOR EACH ROW 

BEGIN 

    IF UPDATING AND nvl(:OLD.columnX,0) <> 0 THEN 
     UPDATE tableB 
     SET columnZ = columnZ - 1 
     WHERE tableB.columnX = :OLD.columnX; 
    END IF: 

    IF nvl(:NEW.columnX,0) <> 0 THEN 
     UPDATE tableB 
     SET columnZ = columnZ + 1 
     WHERE tableB.columnX = :NEW.columnX; 
    END IF; 

END test_trig; 
/

Третий OCASION: tablaA записи могут быть удалены:

CREATE OR REPLACE TRIGGER test_trig 
AFTER INSERT OR DELETE OR UPDATE OF columnX ON tableA 
FOR EACH ROW 

BEGIN 
    IF (UPDATING OR DELETING) AND nvl(:OLD.columnX,0) <> 0 THEN 
     UPDATE tableB 
     SET columnZ = columnZ - 1 
     WHERE tableB.columnX = :OLD.columnX; 
    END IF: 

    IF nvl(:NEW.columnX,0) <> 0 THEN 
     UPDATE tableB 
     SET columnZ = columnZ + 1 
     WHERE tableB.columnX = :NEW.columnX; 
    END IF; 
END test_trig; 
/
0

Я предполагаю, что вы реализуете некоторый механизм для (A) хранения истории (B) counter или (C) проблема целостности данных. , если это так, я бы предложил выполнить обновление, используя пакет pl/sql, который будет обрабатывать все необходимые обновления/другие операции DML. - это лучшая практика для приложения для обновления данных через пакеты pl/sql. таким образом вы можете контролировать процесс внутри, и его гораздо проще в обслуживании. плюс, вы можете сохранить свои проблемы в будущем, когда вы забудете, что у вас есть триггер на этом столе.

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

Смежные вопросы