2011-08-15 30 views
4

確定是否需要用模式名稱(例如,schema.table_name或schema.view_name等)限定Oracle對象(表,視圖等)等等。)?有時我能夠訪問遠程對象(通過數據庫鏈接),而不必限定模式,但有時候,我收到一個錯誤,指出「表或視圖不存在」,併爲了糾正這種情況,我必須限定模式名稱。何時限定Oracle中某個對象的模式名稱

我知道總是限定一個模式名稱是一個最佳實踐,但我只是好奇爲什麼我能夠在沒有限定模式的情況下訪問某些遠程對象,而其他人只能使用限定模式。

+1

正如您所指出的,最好的做法是使用模式名稱進行限定。請注意,如果您不這樣做,並且某人獲得了深入的數據庫訪問權限,他們可能會劫持您的工作。例如,如果他們更改了同義詞,那麼DBMS_UTILITY指向MyBadSchema.DBMS_UTILITY而不是SYS.DBMS_UTILITY。你不知道,他們可以很容易地捕捉你的電話或做其他有問題的事情。所以有資格。 –

回答

0

這取決於您登錄時使用的用戶名。或者創建/配置數據庫鏈接時使用的用戶名。

請參閱每個模式都有一個用戶。如果您以用戶「XYZ」身份登錄,則無需在「XYZ」模式中限定對象。

10

從Oracle文檔: http://download.oracle.com/docs/cd/B14117_01/server.101/b10759/sql_elements009.htm

下面的例子說明了Oracle如何解決SQL語句中對對象的引用。此聲明,增加了數據的行而名部門鑑定表:

INSERT INTO departments 
VALUES 
(
280, 
'ENTERTAINMENT_CLERK', 
206, 
1700); 

基於聲明的情況下,甲骨文確定部門可以是:

  • 的表格中你自己的模式
  • 在自己的架構視圖
  • 的私人同義詞表或視圖
  • 公共同義詞

在考慮架構之外的名稱空間之前,Oracle始終嘗試在自己的架構中的名稱空間內解析對象引用。在這個例子中,甲骨文試圖解析名稱部門如下:

  1. 首先,甲骨文試圖找到在自己的含有模式表,視圖和私人同義詞命名空間中的對象。如果對象是私有同義詞,那麼Oracle將查找同義詞所代表的對象。該對象可以位於您自己的模式,另一個模式或其他數據庫中。該對象也可以是另一個同義詞,在這種情況下,Oracle找到該同義詞所代表的對象。

  2. 如果對象位於命名空間中,則Oracle會嘗試執行該對象上的語句。在這個例子中,Oracle試圖將這一行數據添加到部門。如果對象不是該語句的正確類型,則Oracle返回錯誤。在此示例中,部門必須是表,視圖或解析爲表或視圖的私有同義詞。如果部門是一個序列,那麼Oracle會返回一個錯誤。

  3. 如果該對象不在任何到目前爲止搜索到的名稱空間中,那麼Oracle將搜索包含公共同義詞的名稱空間。如果對象位於該名稱空間中,則Oracle會嘗試執行該語句。如果對象不是該語句的正確類型,則Oracle返回錯誤。在這個例子中,如果部門是一個序列的公共同義詞,那麼Oracle返回一個錯誤。

這是什麼意思,Oracle會在本地檢查您調用的對象,然後向外擴展搜索。 很可能您的某些遠程對象上有公共(或您自己的私人)同義詞,允許您直接引用它們,而沒有同義詞的用戶必須完全符合條件。

+3

我會說「你當前的模式」而不是「你自己的模式」。例如,如果您以'TOM'身份登錄,則執行'ALTER SESSION SET current_schema = BOB',Oracle將在BOB模式中查找表和視圖,而不是在TOM模式中查找。 –

+0

@Justin Cave,我完全同意,部分文本是Oracle自己的文檔逐字。你會認爲他們可能會指出它稍微好一些,不會。 – Ollie

+0

同意。不過,值得在這裏糾正這種疏漏。 –

相關問題