如果要更新目标数据库中的表,同时注意源数据库表中的更改,则编写数据库触发器的最佳方法是什么。
例如:如果我有source-database.source-table和target-database.target-table。我想在source-database.source-table中进行更改时在target-database.target-table中插入一个条目。我可以写这样的东西。
方法1:在目标数据库上写入触发器:
create or replace trigger "target-database"."target-trigger"
after update on source-database.source-table@source-dblink
for each row
where (:new.some-col <> :old.some-col)
begin
insert into target-database.target-table ("col1","col2","col3")
values
("value1","value2","value3")
end;
方法2:在源数据库上写入触发器
create or replace trigger "source-database"."source-trigger"
after update on source-database.source-table
for each row
where (:new.some-col <> :old.some-col)
begin
insert into target-database.target-table@target-dblink ("col1","col2","col3")
values
("value1","value2","value3")
end;
答案 0 :(得分:3)
如果要创建实现复制的触发器,则需要在源数据库上存在触发器。在目标数据库上创建触发器在语法上无效。如果您确实在源数据库上创建了触发器,则需要使用数据库链接来引用目标表,在ON <<table name>>
子句中不会有数据库链接。
但是,你真的,真的不想使用触发器来实现复制。 Oracle提供了大量工具来实现复制 - 物化视图,Streams,Golden Gate等。您真的非常希望使用其中一种解决方案。
答案 1 :(得分:0)
直观地说,我宁愿从源DB开始做类似的事情:
create or replace trigger "source-database"."source-trigger"
after update on source-database.source-table
for each row
where (:new.some-col <> :old.some-col)
begin
insert into target-database.target-table@target-dblink ("col1","col2","col3")
values ("value1","value2","value3");
end;
/
在插入之前没有对DB链接的引用,这是更好的恕我直言。