Objektová práva při Online Application Upgrade (11gR2)

Když jsem se připravoval na již zmiňovaný seminář, dobře jsem si v manuálu přečetl výčet databázových objektů, které lze mechanismem Edition-Based Redefinition verzovat. A tak když padl dotaz na to, zda jsou práva verzovatelná, promítl jsem si před očima výčet z manuálu a mohl s klidným svědomím odpovědět "Ne".... no vlastně moje odpověď byla něco ve smyslu "Nejspíš ne, ale nevím to jistě". Po semináři se mi to ale rozleželo v hlavě a tak jsem radši udělal další ze série pokusů.
Ukázkami chování přidělování systémových práv a rolí vás nebudu zdržovat, ty opravdu nejsou závislé na edici. U objektových práv je to ale zajímavější. Na jedné straně sice nejsou uvedeny na seznamu verzovatelných objektů, na druhé straně se ale vztahují i k pohledům, procedurám a funkcím, tedy objektům verzovatelným. Jak to tedy je?
Z mých pokusů vyplývá, že záleží na tom, zda jde o grant na verzovatelný nebo neverzovatelný objekt.
Ve stručnosti se dá říct, že chování objektového práva kopíruje chování objektu ke kterému se vztahuje. Objektová práva na neverzovatelné objekty, jako jsou třeba tabulky, jsou také neverzovatelné - je jedno, jakou edici jste měl nastavenu, když jste právo přiděloval, či odebíral, efekt se projeví ve všech edicích. Granty na verzovatelné objekty ale naopak edice respektují. Právo platí od edice ve které bylo přiděleno a ve všech edicích, ve kterých je objekt zděděn (ale ne předefinován). Jasnější to snad bude po ukázce.Nejprve ve výchozí edici ORA$BASE nadefinuji tabulku a proceduru. Používám schéma EDITDEMO, které jsem si vytvořil v předchozích ukázkách. Podstatné je, že má samozřejmě aktivované verzování (ALTER USER ... ENABLE EDITIONS).


SQL> ALTER session SET edition=ora$base;
Session altered.


SQL> CREATE TABLE testtable (id NUMBER, a VARCHAR2(100));
Table created.


SQL> CREATE OR REPLACE PROCEDURE test
IS
BEGIN
dbms_output.put_line('verze 1');
END;
/
Procedure created.

V edici PRVNI, ktera je potomkem ORA$BASE pak nagrantuji práva na právě vytvořené objekty.

SQL> ALTER session SET edition=prvni;
Session altered.


SQL> GRANT SELECT ON testtable TO sh;
Grant succeeded.


SQL> GRANT EXECUTE ON test TO sh;
Grant succeeded.

A teď už můžeme testovat - zkusím se přihlásit jako uživatel SH (kterému jsem přidělil právo na všechny používané edice). Uvidíme ve které edici budeme moci pracovat s jakými objekty - začneme s výchozí edicí ORA$BASE:


SQL> ALTER session SET edition=ora$base;
Session altered.


SQL> select * from editdemo.testtable;
no rows selected


SQL> exec editdemo.test;
BEGIN editdemo.test; END;
*
ERROR at line 1:
ORA-06550: řádka 1, sloupec 7:
PLS-00201: identifier 'EDITDEMO.TEST' must be declared
ORA-06550: řádka 1, sloupec 7:
PL/SQL: Statement ignored

Tabulka je neverzovatelný objekt, proto je i právo SELECT na ní neverzovatelné - i když bylo přiděleno až z edice PRVNI, mohu s tabulkou pracovat i v rodičovské edicí ORA$BASE.
U procedury je to jiné. Sice již existovala v edici ORA$BASE, právo EXECUTE jsem ale uživateli SH přidělil až v edici PRVNI, proto s ní zde nemůže uživatel SH pracovat.

Teď edice PRVNI, tam ale žádné překvapení nečekám:


SQL> ALTER SESSION SET EDITION=prvni;
Session altered.


SQL> select * from editdemo.testtable;
no rows selected


SQL> exec editdemo.test;
verze 1
PL/SQL procedure successfully completed.

V této edici objekty existují a uživatel SH má práva s nimi pracovat, není proto překvapením, že obě operace proběhnou bez problémů.
Teď už jen stačí zjistit, jestli se objektová práva dědí. Uděláme pokus v edici DRUHA, která je potomkem edice PRVNi.

SQL> ALTER SESSION SET EDITION=druha;
Session altered.


SQL> select * from editdemo.testtable;
no rows selected


SQL> exec editdemo.test;
verze 1
PL/SQL procedure successfully completed.

Objektová práva tedy respektují i dědění objektů. V edici DRUHA je definice procedury TEST zděděná z PRVNI, proto se dědí i přidělené právo EXECUTE na tuto proceduru pro SH.

Co se ale stane, pokud v edici DRUHA změníme definici procedury?


SQL> alter session set edition=druha;
Session altered.


SQL> create or replace procedure test is
begin
dbms_output.put_line('verze 2 procedury');
end;
/
Procedure created.

Zůstane uživateli SH právo na proceduru TEST v edici DRUHA tak, jak by tomu bylo bez použití edic? Nebo se změnou definice procedury přijdeme i o práva?
Jako uživatel SH tedy provedeme:

SQL> alter session set edition=druha;
Session altered.
SQL> exec editdemo.test;
verze 2 procedury
PL/SQL procedure successfully completed.

Práva, která SH původně získal ke zděděnému objektu tedy zůstanou platná i poté, co se změní definice objektu.

Napadla mne ještě poslední zkouška. Co když se teď vrátím zpět do edice PRVNI, a zkusím přidělit právo na proceduru dalšímu uživateli - třeba HR? Zdědí se toto právo do edice DRUHA teď, když už je v této edici procedura TEST předefinována?
Jako uživatel EDITDEMO:


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


SQL> grant execute on test to hr;
Grant succeeded.

Nyní už můžeme testovat jak to vidí uživatel HR:


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


SQL> exec editdemo.test;
verze 1
PL/SQL procedure successfully completed.


SQL> alter session set edition=druha;
Session altered.


SQL> exec editdemo.test;
BEGIN editdemo.test; END;
*
ERROR at line 1:
ORA-06550: řádka 1, sloupec 7:
PLS-00201: identifier 'EDITDEMO.TEST' must be declared
ORA-06550: řádka 1, sloupec 7:
PL/SQL: Statement ignored

Přidělené právo se tedy zdědí i do následujících edic, jak jsem ověřil v předchozím případě, ale pouze k edici, ve které již existuje předefinovaná verze objektu. Vlastně není nutná ani skutečná redefinice objektu, stačí pokud bude objekt v edici překompilován.

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