for public synonym, only sys user can compile it?

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: 权限不足
请使用浏览器的分享功能分享到微信等