無論是在我的應用程序,這些工作:將模式名稱預先添加到查詢中的表名是否多餘?
INSERT INTO PLATYPUS (Bla, Blee, Bloo, Blah) VALUES (:Bla, :Blee, :Bloo, :Blah)
INSERT INTO CRITTERS.PLATYPUS (Bla, Blee, Bloo, Blah) VALUES (:Bla, :Blee, :Bloo, :Blah)
...是一種方法優於其他?
無論是在我的應用程序,這些工作:將模式名稱預先添加到查詢中的表名是否多餘?
INSERT INTO PLATYPUS (Bla, Blee, Bloo, Blah) VALUES (:Bla, :Blee, :Bloo, :Blah)
INSERT INTO CRITTERS.PLATYPUS (Bla, Blee, Bloo, Blah) VALUES (:Bla, :Blee, :Bloo, :Blah)
...是一種方法優於其他?
對一些已經使用該系統工作後的隱式和顯式的(我稱他們爲「硬編碼」)模式引用,我發現在所有情況下,在應用程序代碼中對模式名稱進行硬編碼會使生活更加困難。
這就是爲什麼Oracle有同義詞。
硬編碼模式名稱的唯一時間是在部署腳本中,例如,當創建一個對象時,我想明確說明應該在哪個模式中創建對象。
這意味着當開發人員詢問「我們可以在同一個實例中擁有我們的開發數據庫的副本嗎?」時,我可以說,「沒問題 - 給我幾分鐘」。我創建一個新的模式,複製表等。然後將其登錄用戶的同義詞更新爲指向新的模式。 Voila,一個實例上的兩個數據庫。但是,如果我讓它們在應用程序代碼中對模式名稱進行硬編碼,這將變得不可能,因爲同義詞翻譯沒有完成。完全。
它們都工作,因爲您可能以默認架構爲CRITTERS的用戶身份登錄。如果您在默認架構不同的情況下以其他用戶身份登錄,則必須使用查詢的限定格式。
如果您使用多個模式,那麼不會。這完全取決於上下文。顯式比隱式更好。
在任何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;
完全。爲了擴大這一點,如果你可以節省時間,一定要明確。誰知道你是否需要一個QA_CRITTERS模式。它會花費數小時追蹤每個你不使用顯式模式的地方。 – 2012-08-02 16:53:37
即使你不能抽出時間,一定要明確!你稍後會感謝你自己! – 2012-08-02 18:39:36