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

Plsql 更新两个用户之间的PL/SQL触发器后,plsql,triggers,Plsql,Triggers,我在模式a中有一个表a,在模式B中有一个表B 模式B.表B的产品信息取自模式A.表A(这是产品配置文件的主数据库) 当模式A.表A中的产品信息发生更新时,该更新应反映在模式B.表B中 我怎样才能为它写触发器 我在这两个表中都有ProductID,为什么不创建一个更新前触发器呢?只有在整个事务提交时,才会提交对tableB的插入 编辑:如果要更新tableB,请尝试以下操作: --drop table testtab_a; create table testtab_a ( col1 varcha

我在模式a中有一个表a,在模式B中有一个表B

模式B.表B的产品信息取自模式A.表A(这是产品配置文件的主数据库)

当模式A.表A中的产品信息发生更新时,该更新应反映在模式B.表B中

我怎样才能为它写触发器


我在这两个表中都有ProductID,为什么不创建一个更新前触发器呢?只有在整个事务提交时,才会提交对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为您的更新设置了适当的授权,以及您可能需要的任何同义词(取决于您的环境)

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


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

为什么不创建更新前触发器?只有在整个事务提交时,才会提交对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为您的更新设置了适当的授权,以及您可能需要的任何同义词(取决于您的环境)

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


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

我不想在表B中插入新记录,我想用新的更新值将其更新到表A中,这是可以实现的吗?在tableA的“更新前”触发器中,您是否尝试过对tableB执行update语句,而不是对tableB执行insert语句?如果否,则始终可以删除并插入表B上受影响的行谢谢。。如果两个表都在同一个模式中,但在我的例子中,两个表都在不同的模式中,并且我无法创建触发器,可能是因为特权问题,所以我必须向DBA进行检查。谢谢你的帮助。!!我不想在表B中插入新记录,我想用新的更新值将其更新到表A中,这是可以实现的吗?在tableA的“更新前”触发器中,您是否尝试过对tableB执行update语句,而不是对tableB执行insert语句?如果否,则始终可以删除并插入表B上受影响的行谢谢。。如果两个表都在同一个模式中,但在我的例子中,两个表都在不同的模式中,并且我无法创建触发器,可能是因为特权问题,所以我必须向DBA进行检查。谢谢你的帮助。!!模式A和B在不同的数据库中吗?如果没有,那么以这种方式复制数据就没有意义了。模式A和B在不同的数据库中吗?否则,以这种方式复制数据就没有意义了。