2009-05-21 56 views
0

我正在研究使用Oracle的內置身份驗證機制來管理用戶帳戶和密碼的應用程序。該應用程序還使用行級安全性。基本上,通過應用程序註冊的每個用戶都會獲得Oracle用戶名和密碼,而不是「USERS」表中的典型條目。用戶還會在特定的表格上收到標籤。這種類型的功能要求在許多情況下將DML和DDL語句的執行結合起來,但這會造成問題,因爲DDL語句執行隱式提交。如果在執行DDL語句後發生錯誤,事務管理將不會將所有內容都回滾。例如,當一個新的用戶與系統註冊以下可能發生:單元測試需要在事務中的DDL語句

  1. 開始交易
  2. 插入人的細節到一個表。 (即名字,姓氏等)-DML
  3. 創建一個oracle賬戶(創建用戶testuser用密碼標識;)-DDL隱式提交。交易結束。
  4. 新交易開始。
  5. 執行更多的DML陳述(插入,更新等)。發生
  6. 錯誤,交易僅回滾到步驟4。

我明白,上述的邏輯是事先設計好的,但我難以尋找到單元測試這種類型的功能和數據管理它接入層。我在數據庫關閉或單元測試期間發生錯誤,導致測試模式被本應回退的測試數據所污染。在發生這種情況時很容易擦除測試模式,但我擔心生產環境中的數據庫故障。我正在尋找解決這個問題的策略。

這是一個Java/Spring應用程序。 Spring正在提供事務管理。

+0

爲用戶創建一個帳戶需要添加新表..? – 2009-05-21 13:36:22

+0

我強烈建議您閱讀cletus的答案,然後再決定使用USERS表的更傳統的方法... – 2009-05-21 13:42:40

回答

2

首先,我必須說:這樣做的壞主意。有兩個原因:

  1. 連接基於用戶。這意味着你很大程度上失去了連接池的好處。它也不能很好地擴展。如果你一次有10,000個用戶,你將不斷打開和關閉硬連接(而不是軟連接池)。和
  2. 正如你發現的那樣,創建和刪除用戶是DDL而不是DML,因此你失去了「事務性」。

不知道爲什麼你選擇做這個,但我會強烈建議您實現在應用程序的用戶,而不是數據庫層。

至於如何解決你的問題,基本上你不能。就像在序列中間創建表或索引一樣。

0

我不同意一些以前的評論,並說使用內置的Oracle帳戶安全性有很多好處。如果您必須用某種附加信息的用戶影子表來擴充這種情況,那麼如何將Oracle帳戶創建包裝在聲明爲PRAGMA AUTONOMOUS_TRANSACTION的單獨包中,並向插入的包返回成功/失敗狀態影子桌?我相信這會將Oracle帳戶創建與交易隔離開來。