Database 在oracle中为两个链接数据库编写触发器的最佳方法是什么

Database 在oracle中为两个链接数据库编写触发器的最佳方法是什么,database,oracle,triggers,Database,Oracle,Triggers,如果您正在更新目标数据库中的表,同时注意到源数据库表中的更改,那么编写数据库触发器的最佳方法是什么 例如:如果我有source-database.source-table和target-database.target-table。我想在source-database.source-table中发生更改时,在target-database.target-table中插入一个条目。我可以这样写吗 方法1:在目标数据库上写入触发器: create or replace trigger "target-

如果您正在更新目标数据库中的表,同时注意到源数据库表中的更改,那么编写数据库触发器的最佳方法是什么

例如:如果我有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;
创建或替换触发器“目标数据库”。“目标触发器”
更新source-database.source后-table@source-数据库链接
每行
其中(:new.some-col:old.some-col)
开始
插入target-database.target-table(“col1”、“col2”、“col3”)
价值观
(“价值1”、“价值2”、“价值3”)
结束;
方法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;    
创建或替换触发器“源数据库”。“源触发器”
更新source-database.source-table后
每行
其中(:new.some-col:old.some-col)
开始
插入到target-database.target中-table@target-dblink(“col1”、“col2”、“col3”)
价值观
(“价值1”、“价值2”、“价值3”)
结束;

直觉上,我宁愿从源数据库开始,然后做一些类似的事情:

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;   
/ 
创建或替换触发器“源数据库”。“源触发器”
更新source-database.source-table后
每行
其中(:new.some-col:old.some-col)
开始
插入到target-database.target中-table@target-dblink(“col1”、“col2”、“col3”)
价值(“价值1”、“价值2”、“价值3”);
结束;
/ 

插入之前没有对DB链接的引用,这在IMHO中更可取。

直觉上,我宁愿从源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;   
/ 
创建或替换触发器“源数据库”。“源触发器”
更新source-database.source-table后
每行
其中(:new.some-col:old.some-col)
开始
插入到target-database.target中-table@target-dblink(“col1”、“col2”、“col3”)
价值(“价值1”、“价值2”、“价值3”);
结束;
/ 

插入之前没有对DB链接的引用,这在IMHO中更可取。

直觉上,我宁愿从源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;   
/ 
创建或替换触发器“源数据库”。“源触发器”
更新source-database.source-table后
每行
其中(:new.some-col:old.some-col)
开始
插入到target-database.target中-table@target-dblink(“col1”、“col2”、“col3”)
价值(“价值1”、“价值2”、“价值3”);
结束;
/ 

插入之前没有对DB链接的引用,这在IMHO中更可取。

直觉上,我宁愿从源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;   
/ 
创建或替换触发器“源数据库”。“源触发器”
更新source-database.source-table后
每行
其中(:new.some-col:old.some-col)
开始
插入到target-database.target中-table@target-dblink(“col1”、“col2”、“col3”)
价值(“价值1”、“价值2”、“价值3”);
结束;
/ 

插入之前没有对DB链接的引用,这在IMHO中更可取。

如果要创建触发器以实现复制,则触发器需要存在于源数据库中。在目标数据库上创建触发器在语法上是无效的。如果确实在源数据库上创建了触发器,则需要使用数据库链接来引用目标表,在
on
子句中就不会有数据库链接

但是,您确实不想使用触发器来实现复制。Oracle提供了一系列工具来实现复制--物化视图、流、金门等等。您真的非常想使用这些解决方案之一

  • 如果使用触发器复制数据,则会显著降低系统的可用性。只有在远程数据库已启动并正在运行且两者之间的网络链接已启动时,针对源表的事务才能成功。这迫使两个系统紧密耦合——你不能在不影响另一个站点的情况下关闭一个站点进行维护
  • 如果使用触发器来复制数据,则会显著影响系统的性能。针对源表的事务现在必须涉及与远程数据库的两阶段提交。这将涉及多个网络往返,并且通常会相当慢(与本地事务相比肯定会很慢)

另一方面,真正的复制解决方案将异步复制数据,对事务性能几乎没有影响。如果两个系统都启动,数据将在很短的延迟后复制。如果目标系统不可用,本地事务仍将成功,并且当目标系统恢复时,数据将被复制

如果要创建触发器以实现复制,则触发器需要存在于源数据库中。在目标数据库上创建触发器在语法上是无效的。如果确实在源数据库上创建了触发器,则需要使用数据库链接来引用目标表,在
on
子句中就不会有数据库链接

但是,您确实不想使用触发器来实现复制。Oracle提供了一系列工具来实现复制--物化视图、流、金门等等。您真的非常想使用这些解决方案之一

  • 如果使用触发器复制数据,则会显著降低系统的可用性。只有在远程数据库已启动并正在运行且两者之间的网络链接已启动时,针对源表的事务才能成功。这迫使两个系统紧密耦合——你不能在不影响另一个站点的情况下关闭一个站点进行维护
  • 如果您使用触发器复制数据,则会显著影响性能