2012-04-06 63 views
1

在我的應用程序中會有大量的用戶,超過500個。它們只處理一個模式對象。我已授予必要的權限。當我說:公共同義詞與schema.object模式

SELECT * FROM EMP; 

我得到的「表或視圖不存在」的錯誤,所以這意味着:

  1. 我要麼需要的對象之前指定的所有者名稱。像SCOTT.EMP
  2. 我可以爲所有我要引用的對象創建公共同義詞。

我擔心的是,如果公共同義詞可能會對具有大約300個同時連接的許多用戶的性能產生影響。我應該選擇第一種還是第二種方法?

+1

你有沒有考慮過使用'alter session set current_schema = SCOTT;'? – 2012-04-07 16:36:15

+0

這是個好主意 – 2012-04-08 07:31:03

回答

4

公共同義詞服務於一個非常特定的目的;他們可以通過用戶啓用一個對象 - 假設他們具有適當的權限。如果在將來的任何時候你可能想要改變一個特定的用戶如何看待一個對象,那麼公共同義詞是不可行的。

它們還用完整個數據庫的特定對象名稱。但是,存在公有同義詞的事實並不妨礙您創建具有相同名稱的對象。這可能令人難以置信地混淆。

例如,假設您有一個過程test和模式emp。嘗試執行emp.test將無法​​正常工作,因爲您已在上擁有公開同義詞emp

Tom Kyteseems to have written anumber of articles about this.

他們似乎表明,在一個私有同義詞公共同義詞將導致slight decrease in performance性能方面。但是,使用同義詞而不是同義詞也會導致性能略有下降。這表明如果每一個最後computron是寶貴的,你不應該使用同義詞。

放在一起我認爲這意味着如果可能的話,你應該避免公開同義詞。如果你需要然後當然使用一個,畢竟他們存在的原因,但如果你不這樣做,那麼有一個是什麼意思? scott.emp構造非常清晰,無論是由您自己還是其他對數據庫和代碼熟悉的人,都可以準確地向您顯示您所引用的模式和對象,而不會有任何誤解的可能性。

快點。你沒有明確地說出來,但你的問題的措辭似乎表明你正在爲每個用戶創建一個模式。這似乎會大量混淆......

+0

非常感謝。我改變了這個問題。 – 2012-04-06 10:35:54