【问题标题】:Synonym not working: USER.SYNONYM_NAME works but SYNONYM_NAME does not同义词不起作用:USER.SYNONYM_NAME 起作用,但 SYNONYM_NAME 不起作用
【发布时间】:2016-07-28 08:02:28
【问题描述】:

我有以下问题:

我为用户创建了一个同义词,以便从另一个模式调用过程,这是 all_synonyms 表的输出,以 USER_1 身份登录到 sqlplus:

OWNER   SYNONYM_NAME  TABLE_OWNER   TABLE_NAME      DB_LINK    ORIGIN_CON_ID
~~~~~   ~~~~~~~~~~~~  ~~~~~~~~~~~   ~~~~~~~~~~      ~~~~~~~    ~~~~~~~~~~~~~
USER_1  SYN_NAME      ADMIN         PROCEDURE_NAME  NULL       0

但我无法仅使用同义词名称来运行它。如果我这样做,我会得到一个 OORA-06550。示例:

exec SYN_NAME;
OORA-06550: line 1, column 7: PLS-00201: identifier 'SYN_NAME' must be declared

exec USER_1.SYN_NAME; //works as expected

我已经对 USER_1 运行了 `grant execute on SYN_NAME;

还有什么我需要设置的吗?我不确定我错过了什么。提前感谢您的帮助。

【问题讨论】:

    标签: oracle stored-procedures synonym


    【解决方案1】:

    如果您更改current_schema,您可以看到这种效果。如果这与您的用户匹配,那么它可以正常工作:

    select user, sys_context( 'userenv', 'current_schema') as schema from dual;
    
    USER                           SCHEMA                       
    ------------------------------ ------------------------------
    USER_1                         USER_1                        
    
    create synonym syn_name for admin.procedure_name;
    
    Synonym SYN_NAME created.
    
    exec syn_name;
    
    PL/SQL procedure successfully completed.
    

    但如果我的会话有不同的current_schema,那么同义词必须以我的真实用户名作为前缀:

    alter session set current_schema = user_2;
    
    Session altered.
    
    select user, sys_context( 'userenv', 'current_schema') as schema from dual;
    
    USER                           SCHEMA                       
    ------------------------------ ------------------------------
    USER_1                         USER_2                        
    
    select owner, synonym_name, table_owner, table_name
    from all_synonyms where synonym_name = 'SYN_NAME';
    
    OWNER                          SYNONYM_NAME                   TABLE_OWNER                    TABLE_NAME                   
    ------------------------------ ------------------------------ ------------------------------ ------------------------------
    USER_1                         SYN_NAME                       ADMIN                          PROCEDURE_NAME                
    
    exec syn_name;
    
    ORA-06550: line 1, column 7:
    PLS-00201: identifier 'SYN_NAME' must be declared
    ORA-06550: line 1, column 7:
    PL/SQL: Statement ignored
    
    exec user_1.syn_name;
    
    PL/SQL procedure successfully completed.
    

    您可能不知道您正在更改当前架构;它可能发生在登录触发器中,可能是为了避免需要同义词。您可以通过以下方式检查当前架构:

    select sys_context( 'userenv', 'current_schema') as schema from dual;
    

    如果这实际上向您显示ADMIN,那么您根本不需要同义词,只需直接调用PROCEDURE_NAME,必须在其前面加上ADMIN 架构名称。

    【讨论】:

    • 谢谢亚历克斯,问题似乎是 current_schema 值。非常感谢您的帮助。
    【解决方案2】:

    如果我没看错,该过程存在于架构管理员中,并且您希望 user_1 能够调用它。

    作为管理员用户:

    grant execute on <procedure_name> to user_1;
    

    作为用户_1:

    create synonym <procedure_name> for admin.<procedure_name>;
    

    【讨论】:

    • 嗨,Rene,抱歉没有说清楚,我已经创建了你提到的同义词。这就是我分享 all_synonyms 表的输出的原因。如您所见,该表包含按照您的建议创建的同义词。我正在调试一个我没有构建的应用程序,所以我想知道其他东西是否会触发错误。
    猜你喜欢
    • 1970-01-01
    • 2019-06-15
    • 1970-01-01
    • 2015-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多