2016-07-28 1 views
0

я следующий вопрос:Синоним не работает: USER.SYNONYM_NAME работает, но SYNONYM_NAME не

Я создал синоним для пользователя, чтобы вызвать процедуру из другой схемы, это выход из all_synonyms журнал таблицы в SQLPLUS в user_1:

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 

Я уже выполнил `grant execute на SYN_NAME USER_1;

Есть ли что-нибудь еще, что мне нужно установить? Я не уверен, что мне не хватает. Спасибо за помощь заранее.

ответ

1

Вы можете видеть, что эффект, если вы измените свое 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 схемы.

+0

Позвольте мне проверить, что Алекс, я верну ответ, как можно скорее. – user1129209

+0

Спасибо Алекс, кажется, что проблема была значением current_schema. Большое спасибо за вашу помощь. – user1129209

1

Если я правильно прочитал, то процедура существует в администраторе схемы и вы хотите, чтобы user_1 мог ее вызвать.

Как пользователь администратора:

grant execute on <procedure_name> to user_1; 

Как user_1:

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

Hi Rene, Извините за то, что я не знаю, я создал синоним, как вы упоминаете. Вот почему я поделился выводами из таблицы all_synonyms. Как вы можете видеть, таблица содержит синоним, созданный по вашему мнению. Я отлаживаю приложение, которое я не создавал, поэтому я хотел знать, может ли что-то другое вызвать ошибку. – user1129209

Смежные вопросы