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: 权限不足