2016-02-21 18 views
0

我正在爲使用Weblogic應用程序和Oracle 11g數據庫的公司工作。意外地看到其他架構上的對象

我們有很多測試機器來測試應用程序。每臺機器連接到相同的數據庫實例,但使用不同的模式。

例如,機號1使用模式和test1具有其自己的一組表,例如test1.paymenttest1.customer等。並且機器編號2使用模式test2的,並且還具有表test2.paymenttest2.customer

通常,如果我們在架構test1訪問數據庫和應用下面的查詢

select * from all_objects where object_name = 'PAYMENT'

我們會得到一個列,其中OBJECT_NAME =「PAYMENT」和owner ='TEST1'

有一天,測試機器號碼2上的應用程序未能以錯誤消息There is more than one owner for type FOO, in the database開始,其中FOO是假名。

我檢查數據庫類型FOO這個SQL

select * from all_objects where object_name = 'FOO'

,讓行,其中所有者是從每一個模式,並認爲這是根本原因。

我不允許編輯導致問題的應用程序源代碼部分。所以我想修復它在數據庫網站。但是,數據庫管理員將缺席一段時間,我沒有DBA權限,但我可以訪問所有模式test1test2,...

的問題是:

爲什麼select * from all_objects where object_name = 'FOO'回報從其他模式的行以及如何使它只返回當前模式的一行?

回答

0

ALL_OBJECTS顯示數據庫中您的登錄名可以看到的所有對象。 USER_OBJECTS只會顯示模式中的對象。 DBA_OBJECTS顯示數據庫中的所有對象,無論您是否可以訪問它們。這就是爲什麼查詢DBA_視圖通常比查詢ALL_視圖更快的原因,在填充結果集之前沒有安全檢查。

DOCS

ALL_

所有用戶

對象到用戶有權

包括由用戶擁有的對象。這些視圖遵循當前啓用的 角色集。

您可以擺脫另一個對象或模式上的GRANT,它允許衝突的對象由查詢中的數據庫解決 - 但這可能還需要DBA干預。

您還可以更改應用程序代碼,以便在您的查詢中明確包含SCHEMA(TEST1或TEST2),以便找不到其他對象。