for public synonym, only sys user can compile it?

pentium發表於2008-09-30

Only sys user can compile public synonym:

[@more@]

Oracle 中的同義詞是schema 物件的一個別名。同義詞分為公共(public)同義詞和私有(private)同義詞.公共同義詞可以被所有資料庫使用者所訪問,而私有同義詞只能被owner和被授權使用者訪問。

同義詞可以不依賴於引用的物件單獨存在,所以我們可以修改同義詞所應用的物件,而後只需要重新定義(刪除重建,同義詞不可以透過ALTER 語法來重新定義)同義詞就可以,這樣可以降低應用程式的複雜性。當同義詞被刪除後所有被同義詞應用的物件(當然TABLE 之類就除外了)將變成INVALID。
當然如果你刪除或修改了某個同義詞所引用的物件,同義詞也會變成INVALID,當然我們不需要去手動compile同義詞,當程式下次訪問的時候,同義詞自動會變成VALID,只要同義詞所引用的物件沒有錯誤就可以。當然,如果你願意你也可以使用ALTER (PUBLIC) SYNONYM語句手工編譯同義詞,注意,這裡你只能使用sys user或者owner來編譯private同義詞。而public同義詞只能用sys user來編譯了。對於非owner或者其他任何使用者,都會收到ORA-01031: insufficient privilege錯誤。
下面來實驗一下:

SQL> conn hr/hr
已連線。
SQL> CREATE synonym syn_jobs FOR jobs;
 
同義詞已建立。
 
SQL> ALTER synonym syn_jobs compile;
 
同義詞已變更。
 
SQL> conn /AS sysdba
已連線。
SQL>  ALTER synonym syn_jobs compile;
 ALTER synonym syn_jobs compile
*1 行出現錯誤:
ORA-00942: 表或檢視不存在
 
 
SQL>  ALTER synonym hr.syn_jobs compile;
 
同義詞已變更。
 
SQL> CREATE public synonym syn_p_jobs FOR hr.jobs;
 
同義詞已建立。
 
SQL> ALTER synonym syn_p_jobs compile;
ALTER synonym syn_p_jobs compile
*1 行出現錯誤:
ORA-00942: 表或檢視不存在
 
 
SQL> ALTER public synonym syn_p_jobs compile;
 
同義詞已變更。
 
SQL> conn system/system;
已連線。
SQL> ALTER public synonym syn_p_jobs compile;
ALTER public synonym syn_p_jobs compile
*1 行出現錯誤:
ORA-01031: 許可權不足
 
 
SQL>  ALTER synonym hr.syn_jobs compile;
 ALTER synonym hr.syn_jobs compile
*1 行出現錯誤:
ORA-01031: 許可權不足
 
 
SQL> CREATE user syn_user IDENTIFIED BY synuser
  2  DEFAULT tablespace users
  3  TEMPORARY tablespace temp;
 
使用者已建立。
 
SQL> conn /AS sysdba
已連線。
SQL>  GRANT sysdba TO syn_user;
 
授權成功。
 
SQL> GRANT dba TO syn_user;
 
授權成功。
 
SQL> GRANT ALL ON hr.jobs TO syn_user;
 
授權成功。
 
SQL> conn syn_user/synuser;
已連線。
SQL>  ALTER synonym hr.syn_jobs compile;
 ALTER synonym hr.syn_jobs compile
*1 行出現錯誤:
ORA-01031: 許可權不足
 
 
SQL>  ALTER public synonym syn_p_jobs compile;
 ALTER public synonym syn_p_jobs compile
*1 行出現錯誤:
ORA-01031: 許可權不足

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/14377/viewspace-1011302/,如需轉載,請註明出處,否則將追究法律責任。

相關文章