簡體   English   中英

在Oracle中為兩個鏈接的數據庫編寫觸發器的最佳方法是什么

[英]What is the best way to write trigger for two linked database in oracle

如果要更新目標數據庫中的表,同時注意源數據庫表中的更改,那么編寫數據庫觸發器的最佳方法是什么。

例如:如果我有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;    

如果要創建實現復制的觸發器,則該觸發器將需要存在於源數據庫上。 在目標數據庫上創建觸發器在語法上無效。 如果確實在源數據庫上創建了觸發器,則需要使用數據庫鏈接來引用目標表,而ON <<table name>>子句中就沒有數據庫鏈接。

但是,您確實真的不想使用觸發器來實現復制。 Oracle提供了許多實現復制的工具-實例化視圖,Streams,Golden Gate等。您確實希望使用其中一種解決方案。

  • 如果使用觸發器來復制數據,則將大大降低系統的可用性。 僅當遠程數據庫已啟動並正在運行並且兩者之間的網絡鏈接已啟動時,針對源表的事務才能成功。 這迫使兩個系統緊密耦合-您不能在不影響另一個站點的情況下進行維護。
  • 如果使用觸發器來復制數據,則會嚴重影響系統的性能。 現在,針對源表的事務必須包含與遠程數據庫的兩階段提交。 這將涉及多個網絡往返,並且通常會很慢(與本地事務相比肯定會很慢)。

另一方面,真正的復制解決方案將異步復制數據,而對事務性能幾乎沒有影響。 如果兩個系統都啟動,則將在很短的延遲后復制數據。 如果目標系統不可用,則本地事務將仍然成功,並且在目標系統恢復時將復制數據。

直觀地講,我寧願從源數據庫開始做類似的事情:

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鏈接,這是最好的恕我直言。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM