2012-08-02 54 views

回答

2

對一些已經使用該系統工作後的隱式和顯式的(我稱他們爲「硬編碼」)模式引用,我發現在所有情況下,在應用程序代碼中對模式名稱進行硬編碼會使生活更加困難。

這就是爲什麼Oracle有同義詞。

硬編碼模式名稱的唯一時間是在部署腳本中,例如,當創建一個對象時,我想明確說明應該在哪個模式中創建對象。

這意味着當開發人員詢問「我們可以在同一個實例中擁有我們的開發數據庫的副本嗎?」時,我可以說,「沒問題 - 給我幾分鐘」。我創建一個新的模式,複製表等。然後將其登錄用戶的同義詞更新爲指向新的模式。 Voila,一個實例上的兩個數據庫。但是,如果我讓它們在應用程序代碼中對模式名稱進行硬編碼,這將變得不可能,因爲同義詞翻譯沒有完成。完全。

2

它們都工作,因爲您可能以默認架構爲CRITTERS的用戶身份登錄。如果您在默認架構不同的情況下以其他用戶身份登錄,則必須使用查詢的限定格式。

3

如果您使用多個模式,那麼不會。這完全取決於上下文。顯式比隱式更好。

+2

完全。爲了擴大這一點,如果你可以節省時間,一定要明確。誰知道你是否需要一個QA_CRITTERS模式。它會花費數小時追蹤每個你不使用顯式模式的地方。 – 2012-08-02 16:53:37

+0

即使你不能抽出時間,一定要明確!你稍後會感謝你自己! – 2012-08-02 18:39:36

1

在任何Oracle應用程序中的第一條語句是明確哪些對象,你會進入狀態:

alter session set current_schema = MYSCHEMA; 

這樣我可以指出我的應用程序到一個數據庫服務器(實例)中不同的架構(數據庫)。所以不要登錄爲模式帳戶。模式帳戶應該被鎖定,並且只能在ddl-changes(升級)期間打開。

比方說,我是一個播音員和我跑幾個渠道:RTL1,RTL2,RTL3,RTL4等..同一個應用程序可以登錄到數據庫服務器中不同的數據庫(Oracle項模式)現在

我跑我的申請RTL1:

alter session set current_schema = RTL1; 
select * from top_stories; 

現在我跑我的申請RTL2:

alter session set current_schema = RTL2; 
select * from top_stories; 

等等

我看到的#1設計缺陷是一對一的關係:應用程序 - 數據庫服務器。 它使管理,存儲和備份全職工作。 Oracle可以在一臺數據庫服務器上運行數千個應用程序和數據庫/模式。

但一如既往,這取決於。有時在一臺數據庫服務器上運行一個應用程序是有意義的。

所以我儘量不要前綴和設計我的應用程序安裝在任何架構。如果我需要訪問其他模式中的對象,我使用視圖和/或同義詞。

這種方法效果很好,我知道哪些對象,我訪問通過查詢:

select sys_context('USERENV','CURRENT_SCHEMA') from dual;  
相關問題