如果您更改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 架构名称。