熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

細化解析如何共享Oracle數據庫身份空間

2013-11-13 22:18:44  來源: Oracle 

  我在個月前才剛剛開始接觸Oracle我最開始覺得古怪的是Oracle沒有身份類型你無法建立一個本身自動遞增的欄

  後來的事實證明這個與眾不同的特點也有它的有用之處例如可以方便地在多個數據庫之間共享同一個身份空間

  首先我們來看一個簡單的例子假設你在數據庫中有一個表一般你會首先建立一個序列

  create sequence seq_my_identity_type

  然後你建立一個從這個序列中選擇下一個新值的觸發器並把那個值作為ID字段保存選擇下一個值的過程使得Oracle自動遞增序列

  在這個簡單的例子中假設你建立了一個名為id_test的表它只有兩個字段一個叫做ID的數字字段和一個叫做message的文本字段

  CREATE TABLE id_test

  ( id NUMBER primary key not null

  message VARCHAR() )

  然後一個觸發器會使用我們前面建立的序列自動增加那個ID字段就像是這樣

  CREATE OR REPLACE TRIGGER t_id_test_bi

  BEFORE INSERT ON id_test

  REFERENCING NEW AS NEW

  OLD AS OLD

  FOR EACH ROW

  begin

  if inserting then

  if :newid is null then

  select seq_my_identity_typenextval

  into :newid

  from dual;

  end if;

  end if;

  end;

  當許多其它DBMS環境有一個自動遞增類型時你似乎可以給ID字段分配許多工作以便在表中插入任何內容時它都會得到一個唯一的鍵但這種用法的優點在於你可以使用序列保證在幾個表之間或者在數據庫的幾個實例的同一個表中共享唯一的ID

  我們來看另一個更詳細的例子假設我們有兩個數據庫一個叫做content_prod的當前生產數據庫和叫做content_qa的QA服務器假設你已經在content_qa數據庫中創建了一個名為content_prod的鏈接以便你可以從QA中訪問它

  我們之前創建的序列觸發器和表位於content_prod中在QA中也有一個id_test表但是我們希望保證如果在QA表中添加任何新內容可以方便地把它復制到生產數據庫中而不必擔心兩個表的ID字段發生沖突

  要保證這一點如果QA和生產數據庫從同一個序列生成它們的ID那麼在一個數據庫中插入的任何新內容將會生成一個在兩個數據庫中唯一的ID所以我們不需要在QA中建立一個單獨的序列只需建立一個在生產數據庫中訪問序列的同義字

  create synonym syn_my_identity_type for

  seq_my_identity_type@content_prod

  然後你在QA中的觸發器將使用這個同義字獲取ID字段

  CREATE OR REPLACE TRIGGER t_id_test_bi

  BEFORE INSERT ON id_test

  REFERENCING NEW AS NEW

  OLD AS OLD

  FOR EACH ROW

  begin

  if inserting then

  if :newid is null then

  select syn_my_identity_typenextval

  into :newid

  from dual;

  end if;

  end if;

  end;

  雖然我不是一位Oracle性能專家但我懷疑在一個或兩個數據庫的序列出現迅速遞增時你是否想要這樣做就像是一個事件記錄器或我的錯誤記錄系統一樣我一直擔心在數據庫之間爭論共享序列造成的性能影響

  我已經將它用於更新頻率較低的簡單情形之中例如用來在一個菜單欄中生成菜單項的表當我們需要在QA或生產數據庫中增加新菜單項我希望確保可以方便地合並兩個數據庫而不會出現ID沖突這種共享序列的方法在這種情況下非常奏效


From:http://tw.wingwit.com/Article/program/Oracle/201311/18748.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.