你可以看到效果,如果你改变你的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
模式名称的前缀它。
让我测试一下Alex,我会尽快回复回复。 – user1129209
感谢Alex,这个问题似乎是current_schema的价值。非常感谢你的帮助。 – user1129209