11gR2 Online Application Upgrade a veřejná synonyma

Další z mnoha nezodpovězených dotazů, které jsem si odnesl z úterního semináře Oracle Coffee, se týkal veřejných synonym. V dokumentaci se dočtete o omezení, které znemožňuje pomocí edic verzovat veřejná synonyma (na rozdíl od těch neveřejných). Když k tomu přidáte fakt, že žádný neverzovatelný objekt nemůže záviset na verzovatelném objektu, máme problém.
Znamená to, že nelze vytvořit veřejné synonymum pouze na objekty, které již mají více edic? Nebo to dokonce znamená že nelze vytvořit veřejné synonymum na verzovatelný objekt i když má pouze 1 verzi? V tom případě by stačilo abyste v určitém schématu aktivovali verzování (ALTER USER ... ENABLE EDITIONS) a od té chvíle by nebylo možné vytvářet veřejná synonyma PL/SQL objekty a pohledy v tomto schématu? Dnes se podíváme, jak to tedy je.Začnu tím, že si vytvořím schéma umožňující verzování objektů:


SQL> CREATE USER editdemo IDENTIFIED BY editdemo;
User created.


SQL> GRANT create session, create procedure, create public synonym TO editdemo;
Grant succeeded.


SQL> ALTER USER editdemo ENABLE EDITIONS;
User altered.



Následně se přihlásím jako právě vytvořený uživatel EDITDEMO, vytvořím v jeho schématu proceduru a pokusím se vytvořit veřejné synonymum odkazující na tuto proceduru:

SQL> CREATE OR REPLACE PROCEDURE origProc IS
BEGIN
dbms_output.put_line('PUVODNI PROCEDURA. Jsme v edici ' || sys_context('USERENV','CURRENT_EDITION_NAME'));
END;
/
Procedure created.


SQL> create public synonym origProc for origProc;
create public synonym origProc for origProc
*
ERROR at line 1:
ORA-38818: neplatný odkaz na upravovaný objekt EDITDEMO.ORIGPROC

Takto snadno tedy veřejné synonymum k verzovatelnému objektu ve schématu podporujícím verzování nevytvoříme. Jakmile je verzovatelný objekt ve schématu, ve kterém je aktivováno verzování, nelze na něj již vytvořit veřejné synonymum.

Přece musí existovat nějaká jiná cesta. Snažit se obalit proceduru jiným objektem asi nepomůže, buď půjde také o verzovaný objekt a pak na něj nepůjde udělat veřejné synonymum, nebo půjde o neverzovaný objekt a v tu chvíli zas nemůže zaviset na verzované proceduře. Jediné náhradní řešení, které mne napadlo, je zavolat proceduru pomocí dynamického SQL z jiné procedury vytvořené ve schématu s neaktivovaným verzováním. Dynamické SQL umožňuje zavolat verzovaný objekt, aniž by se vytvořila klasická vazba závislosti.

Jako uživatel EDITDEMO tedy nagrantuji právo spustit vytvořenou proceduru jinému schématu - použijeme třeba výchozí SH:


SQL> grant execute on origProc to sh;
Grant succeeded.

Jako uživatel SH nejdříve zkusíme použít nativní dynamické SQL:


SQL> CREATE OR REPLACE PROCEDURE wrapper
AUTHID current_user
IS
BEGIN
EXECUTE IMMEDIATE 'begin' || chr(10)
||' editdemo.origProc;'
||chr(10) || 'end;';
END;
/
Procedure created.

Protože tato druhá procedura je ve schématu s neaktivovaným verzováním, lze na ní již běžně vytvořit veřejné synonymum.

SQL>CREATE public SYNONYM mojeSynonymum FOR sh.wrapper;
Synonym created.

Teď již můžeme veřejné synonymum použít, všimněte si, že edice ve které běží původní procedura odpovídá aktuální edici spojení

SQL> exec mojesynonymum;
PUVODNI PROCEDURA. Jsme v edici ORA$BASE
PL/SQL procedure successfully completed.


SQL> alter session set EDITION=prvni;
Session altered.


SQL> exec mojesynonymum;
PUVODNI PROCEDURA. Jsme v edici PRVNI
PL/SQL procedure successfully completed.

Druhá varianta dynamického SQL - využití DBMS_SQL - vám navíc umožní spustit proceduru v jiné edici (i když si nemyslím, že by aplikace měla běžně této možnosti využívat - ono cestování v čase má svá úskalí).


SQL> ALTER SESSION SET EDITION=ora$base;
Session altered.


SQL>CREATE OR REPLACE
PROCEDURE wrapper AUTHID current_user
IS
handle NUMBER;
r NUMBER;
BEGIN
handle :=dbms_sql.open_cursor;
dbms_sql.parse( c=>handle,
statement=>'begin' || chr(10)
||' editdemo.origProc;'
||chr(10)
|| 'end;',
language_flag=>dbms_sql.native,
edition=>'prvni' );
r:=DBMS_SQL.execute(handle);
dbms_sql.close_cursor(handle);
END;
/
Procedure created.


SQL> exec mojesynonymum;
PUVODNI PROCEDURA. Jsme v edici PRVNI
PL/SQL procedure successfully completed.

Comments:

Post a Comment:
  • HTML Syntax: NOT allowed
About

Česky o všem co se točí kolem Oracle Database.

Autoři:

Patrik Plachý
Technology Sales Consultant

David Krch
Principal Consultant
Oracle Expert Services

Oracle Czech

Search

Archives
« duben 2014
PoÚtStČtSoNe
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
    
       
Today