2012-03-30 6 views
1

Мне нужна помощь по созданию триггера на моем table1, который вставляет конкретные столбцы в table2 от table1. Как я могу это сделать? Я использую Oracle 11G XE.TRIGGER with INSERT AND UPDATE

Вот мой код:

create or replace trigger AllowanceTrigger 
after insert on ex_bulacan 
for each row 
begin 
    insert into allowance (PLANT_ORIGIN,SO_NO, SO_STATUS,SO_REMARKS,DRIVER_NAME) 
    values (:new.plant_origin, :new.sales_order_no, :new.status,:new.remarks, :new.driver_name); 
end; ​ 

Что делать, если они обновляют данные в ex_bulacan? Будет ли автоматически изменяться таблица allowance?

+1

Это не изменится, если они будут обновлены, потому что ваш триггер только «после вставки» –

ответ

0

Нет, вы должны были бы триггер, определенный как это:

создать или заменить триггер AllowanceTrigger после вставки или обновления .....

или вы могли бы создать два триггера - один для вставки, и один для обновления

0

Как указано в комментариях от @ e-bacho 2.0, во время обновления ничего не произойдет. Вы должны указать триггер также для события after update. или implment ваш фактический спусковой механизм для обработки также обновление

+0

Можете ли вы дать мне код, основанный на моем кодировании? –

+0

ответ от Justin Cave должен делать то, что вам нужно – Iridio

3

No. Если вы хотите, чтобы триггер, когда есть обновления ex_bulacan, вам потребуется триггер будет определен как after insert и after update. Если вы хотите обновить allowance таблицы, вы хотите что-то вроде

create or replace trigger AllowanceTrigger 
after insert or update on ex_bulacan 
for each row 
begin 
    if(inserting) 
    then 
    insert into allowance (PLANT_ORIGIN, 
          SO_NO, 
          SO_STATUS, 
          SO_REMARKS, 
          DRIVER_NAME) 
    values (:new.plant_origin, 
      :new.sales_order_no, 
      :new.status, 
      :new.remarks, 
      :new.driver_name); 
    end if; 

    if(updating) 
    then 
    update allowance 
     set plant_origin = :new.plant_origin, 
      so_status = :new.status, 
      so_remarks = :new.remarks, 
      driver_name = :new.driver_name 
    where so_no = :new.sales_order_no; 
    end if; 
end; ​ 

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

+0

Хорошо, я попробую ваш код .. что я хочу, если SO_NO в ex_bulacan уже находится в таблице допущений, он автоматически обновит данные в таблице пособий. Спасибо! –

+0

У меня этот мастер ошибок, пожалуйста, помогите нам об этом »Ошибка компиляции, строка 23 (12:26:16) Номера строк, связанные с ошибками компиляции, относятся к первому оператору BEGIN, что влияет только на компиляцию триггеров базы данных». PLS-00103: Встретил символ ";" когда ожидаете одно из следующего: если –

+0

@MichaelPilapil - Вы видели редактирование, которое я сделал, чтобы исправить недостающий «END IF»? Если вы хотите обновить таблицу 'allowance' на основе' so_no', предложение 'WHERE' во втором' UPDATE' должно будет ссылаться на 'so_no'. Я предполагаю, что это означало бы, что вы хотите также «ОБНОВИТЬ» столбец «plant_origin». –