同义词无效:USER.SYNONYM_NAME 有效但 SYNONYM_NAME 无效

Synonym not working: USER.SYNONYM_NAME works but SYNONYM_NAME does not

我有以下问题:

我为用户创建了同义词以便从另一个模式调用过程,这是 all_synonyms table 以 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

我已经 运行`g运行t 在 SYN_NAME 到 USER_1 上执行;

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

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

作为管理员用户:

grant execute on <procedure_name> to user_1;

作为user_1:

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

如果你改变你的 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 架构名字.