本文转载自微信公众号《DBA闲思杂想录》,作者潇湘隐士。转载本文请联系DBA杂念公众号。我们在编译INVALID同义词(synonym)的时候,在某些版本中可能会遇到一些特殊的权限问题,具体来说就是ORA-01031错误。下面构造这样一个例子:如下图,用户scott创建了一个publicsynonymemp(下面的测试环境是Oracle10.2.0.5)SQL>showuser;USERis"SCOTT"SQL>createpublicsynonymempforscott.emp;Synonymcreated.SQL>假设我们需要重新编译同义词。系统用户编译同义词时会遇到ORA-01031SQL>showuser;USERis"SYSTEM"SQL>alterpublicsynonymempcompile;alterpublicsynonymempcompile*ERRORatline1:ORA-01031:insufficientprivileges另一种情况也会遇到这个错误。如果UserA编译UserB下的同义词,也会遇到这个错误。按照我的理解,如果用户有CREATEANYSYNONYM和DROPANYSYNONYM权限,应该可以在其他schema下编译同义词。并且SYSTEM用户被赋予了DBA角色,DBA角色有CREATEANYSYNONYM或者DROPANYSYNONYM的权限。SQL>SELECT*FROMDBA_SYS_PRIVSWHEREPRIVILEGEIN('CREATEANYSYNONYM','DROPANYSYNONYM')ANDGRANTEE='DBA';GRANTEEPRIVILEGEADM------------------------------------------------------------------------------DBADROPANYSYNONYMYESDBACREATEANYSYNONYMYESSQL>SELECT*FROMDBA_ROLE_PRIVSWHEREGRANTEE='SYSTEM';GRANTEEGRANTED_ROLEADMDEF---------------------------------------------------------------SYSTEMAQ_ADMINISTRATOR_ROLEYESYESSYSTEMDBAYESYESSYSTEMMGMT_USERNOYES但是metalink上的documentDocID1299001.1提示:编译同义词时,sys用户或者同义词的OWNER都可以被编译,也就是说,如果要编译同义词emp,你必须是scott用户或者sys用户。SQL>showuserUSERis"SYS"SQL>alterpublicsynonymempcompile;Synonymaltered。因此,要在Oracle10g下编译其他模式下的同义词,必须是sys用户。Ora-01031WhenCompilingASynonym(DocID1299001.1)的介绍如下:文档Ora-01031WhenExecutingAlterSynonymCompileForOtherSchema(DocID1435898.1)在Oracle11.2.0.4.0中也有相关的简要说明。However,thisphenomenonisregardedasabuginthefollow-upofficialdocuments.Thereisabriefintroductionintheofficialdocument4189542-OnlySYScan"altersynonym...compile"foranotherusers'ssynonym(DocID4189542.8),anditwillbefixedinsomelaterversions了这个Bug,DocID4189542.8的具体信息如下如下:OnlySYScan"altersynonym...compile"foranotherusers'ssynonym.OtherusersgetORA-1031attemptingtocompileanotheruserssynonym.WiththisfixauserwithbothCREATEANYSYNONYMandDROPANYSYNONYMprivilegeisallowedtoissueALTERSYNONYM..COMPILEforanotheruserssynonym.相同的现象在不同文档中有不同阐述,确实有点让人迷惑,iftheinformationobtainedisincompleteorone-sided,theremaybedifferentunderstandingsofthisproblemandphenomenon.Reference:Ora-01031WhenCompilingASynonym(DocID1299001.1)Ora-01031WhenExecutingAlterSynonymCompileForOtherSchema(DocID1435898.1)Bug4189542-OnlySYScan"altersynonym...compile"foranotherusers's(DocID4189542.8)
