1

emp同じ構造とcopy_emp同じデータを持つ2つのテーブルがあります。で発生した変更empを に反映する必要があるかどうかを確認しcopy_empます。したがって、以下に示すトリガーを作成しました。

create or replace trigger t
after
insert or
update of empno or
delete
on emp
for each row
begin
case
when inserting then
  insert into copy_emp(empno,ename,sal) values (:NEW.empno,:NEW.ename,:NEW.sal);
when updating then
  if updating('empno') then
    update copy_emp set copy_emp.empno=:new.empno where copy_emp.empno=:old.empno;
  elsif updating('ename') then
    update copy_emp set copy_emp.ename=:new.ename where copy_emp.ename=:old.ename;
  elsif updating('sal') then
    update copy_emp set copy_emp.sal=:new.sal where copy_emp.sal=:old.sal;
end if;
when deleting then
  delete from copy_emp where empno = :old.empno;
end case;
end;

トリガーはエラーなしで作成され、挿入と削除は正常に機能します。問題は更新です。empnoテーブルの列を更新すると、empテーブルでも更新されcopy_empます。しかし、更新enameまたはsal列を作成すると、テーブルでは更新されempますが、テーブルでは更新されませんcopy_emp。助けてください。

4

2 に答える 2

3

このように宣言の一部にenameandsal列を含める必要があるため、トリガーは起動していません...update of

create or replace trigger t
after
insert or 
update of empno, ename, sal or
delete on emp

ただし、現在のif/elseロジックでは、更新ステートメントに複数の列が含まれていても、更新されるのは 1 つの列だけです。最初ifに一致した列が更新されます。if/elseを一連の に変更できますがif、複数の更新が実行されることになります。したがって、異常な要件がない限り、@Glenn のソリューションを使用することをお勧めします。

于 2013-05-16T23:05:53.053 に答える