同义词无效: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
架构名字.
我有以下问题:
我为用户创建了同义词以便从另一个模式调用过程,这是 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
架构名字.