Uživatelé, role a práva

Uživatelé a schémata

Objekty (tabulky, pohledy, procedury, ...) jsou v databázi logicky rozděleny do schémat. Každý uživatel má přiděleno svoje schéma pojmenované podle jeho uživatelského jména.

Předem definovaná schémata jsou SYS, SYSTEM (odpovídají speciálním systémovým uživatelům) a PUBLIC (odpovídá "skupině" všech uživatelů). Schéma SYS a objekty v něm obsažené je určeno pro zajištění činnosti databázového serveru. Schéma SYSTEM obsahuje další objekty sloužící pro aplikace pracující s celou databází. Schéma PUBLIC obsahuje jen synonyma objektů patřících do schémat SYS a SYSTEM, které mají být dostupné všem uživatelům.

Práva (privileges)

Cílem je omezení uživatele tak, aby směl manipulovat jen s určitými objekty a to daným způsobem (tj. omezení lze rozlišovat podle objektu a SQL příkazu, kterým je objekt manipulován). Každý uživatel má přidělenu množinu práv, kterými disponuje. Práva přidělená "skupině" PUBLIC mají automaticky všichni uživatelé.

Práva jsou dvojího druhu: systémová práva a práva na objekty.

Systémová práva (system privileges)

Jsou jich řádově desítky a používají se pro umožnění nějaké činnosti globálně na všech objektech daného typu. Např. právo SELECT ANY TABLE umožní uživateli provést příkaz SELECT na libovolné tabulce či pohledu v databázi kromě těch ve schématu SYS.

Seznam všech práv, které lze nastavit najdete v dokumentaci.

Příklady (jaká práva se dají přidělit pro manipulaci s procedurami):
CREATE PROCEDUREvytvořit procedury a funkce ve vlastním schématu.
CREATE ANY PROCEDUREvytvořitprocedury a funkce v libovolném schématu kromě SYS.
ALTER ANY PROCEDUREzměnit
DROP ANY PROCEDUREzrušit
EXECUTE ANY PROCEDUREvykonat

Analogicky (tj. podle druhů SQL příkazů) jsou definována práva na ostatní objekty.

Práva na objekty (object privileges)

Oracle umožňuje přidělit práva na konkrétní objekty.
Každý typ objektu má jistou množinu práv, která mohou být přidělena jeho instancím.
Práv na objekty je malý počet, proto je lze shrnout do jednoduché tabulky:

tabulkypohledysekvenceprocedury
SELECT X X X  
UPDATE X X    
INSERT X X    
DELETE X X    
ALTER X   X  
INDEX X      
REFERENCESX      
EXECUTE       X

Poznámky:

Právo může být přiděleno přímo uživateli nebo prostřednictvím tzv. role, což je pojmenované množina práv.

Přidělování práv a rolí

Uživatel může přidělovat systémová práva a role, pokud mu byly přiděleny s nastaveným parametrem ADMIN OPTION. Dále může přidělovat práva na objekty ve svém schématu či na objekty, na které my byla přidělena práva s nastaveným parametrem GRANT OPTION. Tato omezení lze obejít, má-li uživatel systémové právo GRANT ANY PRIVILEGE resp. GRANT ANY ROLE. Obě tato práva mají implicitně uživatelé SYS a SYSTEM.

Práva lze přidělit přímo konkrétním uživatelům či roli. Přidělení práv roli odpovídá jejich přidání do množiny práv, kterou role reprezentuje. Analogicky lze přidělit roli (tj. množinu práv) uživateli nebo jiné roli.

K přidělování práv a rolí slouží dvě verze SQL příkazu GRANT.

Pro systémová práva a role:


Pro práva na objekty (zjednodušeno):


Vysvětlení:
system_priv je systémové právo (např. SELECT ALL TABLES)
object_priv je právo na objekt (např. SELECT ALL TABLES)
column je sloupec tabulky resp. pohledu, pokud je možno právo omezit na sloupec
ALL [PRIVILEGES] přidělí všechna práva, která mohou být přidělena (tj. byla přidělena WITH GRANT OPTION)
Příklady:
GRANT SELECT,INSERT ON Tab1 TO seminar_po; 
GRANT GRANT ANY PRIVILEGE TO matot0am;

Odebrání práv

Přidělená práva lze zrušit SQL příkazem REVOKE, jehož syntaxe je analogická syntaxi GRANT s tím rozdílem, že namísto slova GRANT je slovo REVOKE a namísto slova TO je slovo FROM.

Jaká máme práva?

Seznam systémových práv, které má uživatel přihlášený k serveru k dispozici, zjistí uživatel nahlédnutím do pohledu SESSION_PRIVS. Seznam svých práv na objekty, které mu byly přiděleny, resp. seznam práv, které naopak přidělil jiným uživatelům, nalezne v pohledech USER_TAB_PRIVS, USER_TAB_PRIVS_MADE, USER_TAB_PRIVS_RECD, USER_COL_PRIVS, USER_COL_PRIVS_MADE, USER_COL_PRIVS_RECD.

Role

Jak již bylo uvedeno, role je pojmenovaná množina práv.

Vytvoření, změna a zrušení role

Roli můžeme vytvořit pomocí příkazu CREATE ROLE:


Význam identifikace ([NOT] IDENTIFIED ...) bude uveden dále.
Práva roli nastavíme příkazem GRANT.
Roli lze také zrušit příkazem DROP ROLE či změnit identifikaci příkazem ALTER ROLE.

Předdefinované role

Některé role jsou v databázi hned po jejím vytvoření. Mezi nimi jsou i následující dvě:
DBArole administrátora - má všechna existující práva, je také automaticky přidělena uživatelům SYS a SYSTEM
CONNECTpřidána automaticky každému nově vytvořenému uživateli,
obsahuje práva CREATE TABLE/VIEW/SYNONYM/SEQUENCE/CLUSTER/SESSION/TYPE/DATABASE LINK, ALTER SESSION
Tyto role lze modifikovat.

Platnost role

Každá role má pro daného uživatele dva možné stavy. Buďto je zapnutá - práva, která obsahuje jsou přenesena na uživatele, nebo je vypnutá a práva, která obsahuje jsou uživateli odebrána.

Poté, co se uživatel přihlásí k serveru, jsou všechny role, které mu byly přiděleny příkazem GRANT zapnuty. Pokud chce uživatel pro sebe roli zapnout či vypnout, může tak učinit příkazem SET ROLE:


Příklad:
Administrátor vytvoří novou roli MojeRole a přidá ji uživateli Tomas, který je již přihlášen:

CREATE ROLE MojeRole IDENTIFIED BY Heslo;
GRANT MojeRole TO Tomas;
Uživatel si zobrazí seznam rolí, které má právě zapnuty (jejich seznam je v tabulce SESSION_ROLES) ...
SELECT * FROM SESSION_ROLES;
-> CONNECT 
... a zjistí, že má roli CONNECT. Role MojeRole ještě nebyla zapnuta, takže ji zapne ...
SET ROLE MojeRole IDENTIFIED BY Heslo;
SELECT * FROM SESSION_ROLES;
-> MojeRole
... jelikož uvedl jen roli MojeRole, vypla se role CONNECT a zapnula se role MojeRole ...
SET ROLE MojeRole IDENTIFIED BY Heslo, CONNECT;
SELECT * FROM SESSION_ROLES;
-> CONNECT
-> MojeRole
... a nyní už má obě dvě role.

Po přidělení role uživateli se tato role neuplatní ihned, ale až poté, co se uživatel přihlásí nebo o její zapnutí explicitně požádá příkazem SET ROLE. Narozdíl od rolí má přidělení práv uživateli okamžitý efekt.

Aplikace rolí v PL/SQL

Blok lze zkompilovat, pokud má jeho tvůrce potřebná práva na všechny objekty, se kterými v bloku pracuje. Při vyvolání bloku se kontroluje, zda má uživatel právo tento blok vyvolat (práva EXECUTE, EXECUTE ANY PROCEDURE).

Jaká práva budou platná a jaké role zapnuté při zpracovávání bloku PL/SQL určují vlastnosti bloku.

Anonymní bloky a pojmenované bloky typu invoker-rights

V těchto blocích má vykonávaný program stejná práva jako má uživatel, který blok vyvolal.
Všechny role, které měl uživatel byly zapnuty zůstávají zapnuty.

Pojmenované bloky typu definer-rights

V těchto blocích přejímá vykonávaný program práva svého tvůrce.
Všechny role uživatele jsou vypnuty.
Po ukončení z bloku budou práva a role vráceny do původního stavu.

Typ bloku lze nastavit při jeho definici (implicitně je každý pojmenovaný blok typu definer-rights). Stačí za deklaraci jeho hlavičky uvést následující:

Příklad:
CREATE OR REPLACE FUNCTION Funkce(/* Parametry */) RETURN NUMBER AUTHID CURRENT_USER AS
BEGIN
  /* Kód */
END;