在两个用户之间更新PL / SQL触发器之后

时间:2011-02-14 19:41:27

标签: plsql triggers

我在模式A中有表A,在模式B中有表B.

Schema B.Table B的产品信息来自Schema A.Table A(这是产品简介的主要数据库)。

当产品更新发生在架构A.表A中的信息时,该更新应反映在架构B中。表B?

我如何为它编写触发器?..

我在两个表中都有ProductID

1 个答案:

答案 0 :(得分:1)

为什么不创建更新之前的触发器?只有在整个事务提交时才会提交对tableB的插入。

编辑:如果你想要更新到tableB,试试这个:

--drop table testtab_a;

create table testtab_a
(
col1 varchar2(10) primary key,
col2 varchar2(10)
);
--drop table testtab_b;
create table testtab_b
(
col1 varchar2(10) primary key,
col2 varchar2(10)
);
insert into testtab_a values ('A', 'B');
insert into testtab_a values ('X', 'B');
insert into testtab_a values ('Z', 'C');

insert into testtab_b values ('A', 'B');
insert into testtab_b values ('X', 'B');
insert into testtab_b values ('Z', 'C');

CREATE OR REPLACE TRIGGER testtab_tr
BEFORE UPDATE
ON testtab_a REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
begin
        update testtab_b
        set col1 = :new.col1,
        col2 = :new.col2
        where col1 = :old.col1;
end;

select * from testtab_a;
select * from testtab_b;

update testtab_a set col2 = 'H' where col1 = 'A';

EDIT2:如果需要跨模式,可以使用dblink。

内部触发器使用:

            update testtab_b@someSchema
            set col1 = :new.col1,
            col2 = :new.col2
            where col1 = :old.col1;

确保DBA有适当的授权设置来进行更新,以及您可能需要的任何同义词(取决于您的环境)。

最后,如果您试图将这两个表保持为“同步”,那么不要忘记插入和删除(也可以通过类似的触发器处理)。

然而,这是 NOT 复制的答案,这种方法应该非常谨慎地使用。