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.
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.
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 PROCEDURE | vytvořit procedury a funkce ve vlastním schématu. | |
| CREATE ANY PROCEDURE | vytvořit | procedury a funkce v libovolném schématu kromě SYS. |
| ALTER ANY PROCEDURE | změnit | |
| DROP ANY PROCEDURE | zrušit | |
| EXECUTE ANY PROCEDURE | vykonat | |
Analogicky (tj. podle druhů SQL příkazů) jsou definována práva na ostatní objekty.
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:
| tabulky | pohledy | sekvence | procedury | ||
| SELECT | X | X | X | ||
| UPDATE | X | X | |||
| INSERT | X | X | |||
| DELETE | X | X | |||
| ALTER | X | X | |||
| INDEX | X | ||||
| REFERENCES | X | ||||
| EXECUTE | X |
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.
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:

GRANT SELECT,INSERT ON Tab1 TO seminar_po; GRANT GRANT ANY PRIVILEGE TO matot0am;
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.
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.
Jak již bylo uvedeno, role je pojmenovaná množina práv.

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.
Některé role jsou v databázi hned po jejím vytvoření. Mezi nimi jsou i následující dvě:
| DBA | role administrátora - má všechna existující práva, je také automaticky přidělena uživatelům SYS a SYSTEM |
| CONNECT | př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 |
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.
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.
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.
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.

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