更新一行以更新另一个表时如何创建触发器

时间:2017-04-26 07:48:21

标签: sql oracle plsql triggers

我有两个表,其中包含带有产品ID的引用。表格如下。

表1:ID,Rgrupa 表2:ID,Rgrupa

我想创建触发器,当表1中的Rgrupa更新时,将从表2更新Rgrupa,以获得相同的产品ID。

我试过这个

create or replace trigger test 
after update of rgrupa on table1 
begin 
update table2 t2 
set t2.rgrupa = :new.rgrupa 
where t2.id = :new.id;
end; 

错误信息是: 错误:ORA-04082:表级触发器中不允许新的或旧的引用

2 个答案:

答案 0 :(得分:3)

如果我运行你的代码:

SQL> CREATE OR REPLACE TRIGGER test
  2      AFTER UPDATE OF rgrupa
  3      ON table1
  4  BEGIN
  5      UPDATE table2 t2
  6         SET t2.rgrupa    = :new.rgrupa
  7       WHERE t2.id = :new.id;
  8  END;
  9  /
CREATE OR REPLACE TRIGGER test
                          *
ERROR at line 1:
ORA-04082: NEW or OLD references not allowed in table level triggers

Oracle明确表示您的代码存在问题。 如果要使用:new,则需要行级触发器:

SQL> CREATE OR REPLACE TRIGGER test
  2      AFTER UPDATE OF rgrupa
  3      ON table1
  4      FOR EACH ROW
  5  BEGIN
  6      UPDATE table2 t2
  7         SET t2.rgrupa    = :new.rgrupa
  8       WHERE t2.id = :new.id;
  9  END;
 10  /

Trigger created.

答案 1 :(得分:1)

我使用下面的结构来创建触发器

create table table1 (id int, rgrupa varchar2(100));
create table table2 (id int, rgrupa varchar2(100));

insert into table1 (id,rgrupa) values (1,'A');
insert into table1 (id,rgrupa) values (2,'B');
insert into table1 (id,rgrupa) values (3,'C');

insert into table2 (id,rgrupa) values (1,'A');
insert into table2 (id,rgrupa) values (2,'B');

commit;

select * from table1;
select * from table2;

create or replace trigger sandeeptest after update of rgrupa on table1 for each row
begin
update table2 set rgrupa=:new.rgrupa where id=:new.id;
end;

update table1 set rgrupa='Aa' where rgrupa='A';

update table1 set rgrupa='Cc' where rgrupa='C';
相关问题