首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >同义词不起作用: USER.SYNONYM_NAME起作用但SYNONYM_NAME不起作用

同义词不起作用: USER.SYNONYM_NAME起作用但SYNONYM_NAME不起作用
EN

Stack Overflow用户
提问于 2016-07-28 16:02:28
回答 2查看 2.4K关注 0票数 0

我有以下问题:

我已经为一个用户创建了一个同义词,以便从另一个模式调用过程,这是作为USER_1从all_synonyms表日志到sqlplus的输出:

代码语言:javascript
复制
OWNER   SYNONYM_NAME  TABLE_OWNER   TABLE_NAME      DB_LINK    ORIGIN_CON_ID
~~~~~   ~~~~~~~~~~~~  ~~~~~~~~~~~   ~~~~~~~~~~      ~~~~~~~    ~~~~~~~~~~~~~
USER_1  SYN_NAME      ADMIN         PROCEDURE_NAME  NULL       0

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

代码语言:javascript
复制
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运行了‘SYN_NAME上的授权执行’;

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-07-28 17:31:08

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

代码语言:javascript
复制
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,那么同义词必须以我的真实用户名作为前缀:

代码语言:javascript
复制
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.

您可能不知道您正在更改当前的模式;它可能发生在登录触发器中,可能是为了避免使用同义词。您可以使用以下命令检查当前架构:

代码语言:javascript
复制
select sys_context( 'userenv', 'current_schema') as schema from dual;

如果实际显示的是ADMIN,则根本不需要同义词,只需直接调用PROCEDURE_NAME,而必须在其前面加上ADMIN模式名称。

票数 1
EN

Stack Overflow用户

发布于 2016-07-28 16:21:22

如果我没看错的话,这个过程存在于schema admin中,您希望user_1能够调用它。

作为管理员用户:

代码语言:javascript
复制
grant execute on <procedure_name> to user_1;

作为user_1:

代码语言:javascript
复制
create synonym <procedure_name> for admin.<procedure_name>;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38630442

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档