2013-07-17 31 views
1

的下面是我的表結構:秩序Oracle觸發器和語句的執行存儲過程

Table -Customer 
CustomerID Blacklisted Customer Name 
101 Y ABC 
102 Y DEF 

Table -Blacklist 
CustomerID BlacklistID Customer Name 
101 1011 ABC 
102 1012 DEF 

Table -Reason 
BlacklistID ReasonID Reason Code 
1012 02 Rcode2 

主表「客戶」是用來存儲客戶information.There是對錶「客戶」,以更新後觸發如果有人在客戶表中將黑名單更新爲Y,則在表「黑名單」中插入記錄。 我們認爲客戶被列入黑名單,如果,

  • 客戶表中列入黑名單的值爲'Y'和。
  • 沒有出現客戶在黑名單和原因表中的記錄

現在,我的要求是從列入黑名單的backend.For客戶這個我寫下面的查詢存儲過程:

  1. 更新客戶set blacklisted ='Y'where customerid ='102';
  2. 從黑名單中選擇BlacklistID到var_id,其中customerid ='102';
  3. 插入原因(BlacklistID,ReasonID,ReasonCode)values(var_id,111,'RCODE1');

現在要在Reason表中插入條目(步驟-3),我需要BlacklistID這是一個外鍵,一旦客戶表上的觸發器被優先處理,我將得到BlacklistID的值。所以我的困惑是,可以我假設在'客戶'表的更新觸發器將始終得到執行之前,控制達到我的INSERT INTO原因(步驟3)陳述。請建議。

回答

1

是的。觸發器是聲明的一部分。雖然你不能完全確定在同一個語句中執行多個觸發器的順序,但你可以確定它們是在語句本身完成時完成的。所以到了第二步時,第一步的所有更新觸發器都被觸發了。

*)其實,默認順序爲:觸發後觸發後觸發前觸發之前

  1. 語句級別
  2. 行級
  3. 行級
  4. 語句級別

但是如果你在觸發之前有兩行級別,默認情況下你不能確定這兩個行爲是以什麼順序執行的cuted。但是我從Oracle 11的評論中瞭解到,實際上,您甚至可以指定該命令來涵蓋這些情況。

+0

感謝您的回覆。 – user2548985

+0

您*可以*指定觸發器的順序。請參閱手冊:http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/create_trigger.htm#CJAEJAFB –

+0

使用CREATE TRIGGER上的FOLLOWS語法可以保證觸發器執行順序從11.1開始。 http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/create_trigger.htm –

1

我看不到所有這些表的需要,因此不需要觸發器。

爲什麼您不只是在客戶表中使用黑名單原因代碼?黑名單表的用途目前還不清楚,因爲它似乎沒有添加任何數據,只是通過附加ID列重複客戶表中的數據?

或者如果您需要多個原因代碼,那麼只需使用引用客戶ID和原因代碼的blacklist_reason表格 - 我不認爲您甚至需要客戶表中的列入黑名單的列。

+1

嗨大衛,這些都不是真正的表結構:)我的實際表包含超過10-12列。上面的快照只是爲了解釋情況。表和觸發器的一切都已到位,我不能刪除/添加任何東西。根據客戶的一些新的額外要求,我必須從後端進行黑名單。 – user2548985

1

如果您需要確定觸發器執行的順序,您可以在創建觸發器時指定此順序。

更多細節的手冊中:

這與創建觸發器聲明FOLLOWS ...PRECEEDS ...選項做http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/create_trigger.htm#CJAEJAFB

FOLLOWS | PRECEDES

指定具有相同時間點的觸發器的相對觸發。創建交叉引發觸發器時特別有用,交叉引發觸發器必須按特定順序觸發以實現其目的。

使用FOLLOWS指示正在創建的觸發器必須在指定的觸發器之後觸發。您可以指定FOLLOWS用於傳統觸發器或用於正向串擾觸發器。

使用PRECEDES指示正在創建的觸發器必須在指定的觸發器之前觸發。您只能爲反向串擾觸發器指定PRECEDES。

+0

很好的答案來反駁我對訂購的評論,但那實際上只是一個附註。原來的問題是關於單獨的陳述。 – GolezTrol

相關問題