2016-07-28 17 views
0

Ich habe folgendes Problem:Synonym nicht funktioniert: USER.SYNONYM_NAME funktioniert, aber synonym_name nicht

ich ein Synonym für einen Benutzer erstellt, um habe ein Verfahren von einem anderen Schema zu nennen, ist dies die Ausgabe von dem all_synonyms Tabelle anmelden in sqlplus als USER_1:

Aber ich kann es nicht nur mit dem Synonymnamen ausführen. Wenn ich das tue, bekomme ich einen OORA-06550. Beispiel:

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 

Ich habe `grant execute auf SYN_NAME bereits an USER_1 ausgeführt;

Gibt es noch etwas, das ich einstellen muss? Ich bin mir nicht sicher, was ich vermisse. Danke für die Hilfe im Voraus.

Antwort

1

Sie können diesen Effekt sehen, ob Sie Ihre current_schema ändern. Wenn das Ihre Benutzer passt dann funktioniert es OK:

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. 

Aber wenn meine Sitzung eine andere current_schema hat dann hat das Synonym mit meinem wirklichen Benutzernamen vorangestellt werden:

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. 

Sie nicht, dass Sie wissen vielleicht, Ändere dein aktuelles Schema; Es kann in einem Login-Trigger passieren, möglicherweise um Synonyme zu vermeiden. Sie können mit Ihrem aktuellen Schema prüfen:

select sys_context('userenv', 'current_schema') as schema from dual; 

Wenn das tatsächlich zeigt Ihnen ADMIN dann brauchen Sie gar nicht das Synonym und kann PROCEDURE_NAME direkt rufen Sie einfach an, damit mit dem ADMIN Schemanamen voranstellen müssen.

+0

Lassen Sie mich das Alex testen, werde ich zurück so schnell wie möglich antworten .. – user1129209

+0

Dank Alex, scheint, dass das Problem der Current_schema-Wert war. Vielen dank für Deine Hilfe. – user1129209

1

Wenn ich dies richtig gelesen habe, existiert die Prozedur im Schema admin und Sie möchten, dass Benutzer_1 sie aufrufen kann.

Als Admin-Benutzer:

grant execute on <procedure_name> to user_1; 

Als user_1:

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

Hallo Rene, Sorry für nicht so klar, ich habe das Synonym erstellt, wie Sie erwähnen. Aus diesem Grund habe ich die Ausgabe aus der Tabelle all_synonyms geteilt. Wie Sie sehen können, enthält die Tabelle ein Synonym, das wie vorgeschlagen erstellt wurde. Ich debugge eine Anwendung, die ich nicht erstellt habe, deshalb wollte ich wissen, ob etwas anderes den Fehler auslösen könnte. – user1129209