< Řídící příkazy | SQL postupně | REVOKE >
Tímto příkazem přidějujeme nějaké právo nějakému uživateli či roli. Různých možných systémových práv i objektových práv je mnoho, zde ukážeme, jak přidělovat vybraná základní práva k tabulkám a pohledům.
V příkladech předpokládáme, že existují uživatelé KROKODYL1 a KROKODYL2 a že se můžete jako tito uživatelé přihlásit. Eventuelně zaměňte tato uživatelská jména za jiná, která se hodí pro váš případ. Tabulky a pohledy z uvedených příkladů jsou z kapitol CREATE TABLE a CREATE VIEW
Příklad: Přidělte právo INSERT a UPDATE k tabulce TEMA uživateli KROKODYL1.
grant insert, update on TEMA to KROKODYL1; |
Přihlašte se jako KROKODYL1 a vyzkoušejte práva k tabulce <schema_kde_jste_pohled_vytvořili>.TEMA . Asi vám bude chybět právo SELECT... |
Příklad: (Přihlašte se k původnímu účtu.) Přidělte právo SELECT k pohledu POCTY_VE_MESTECH uživateli KROKODYL2, dejte mu možnost toto právo postoupit dalším uživatelům.
grant select on POCTY_VE_MESTECH to KROKODYL2 with grant option; |
Klauzule with grant option znamená, že uživatel, kterému je takto právo přiděleno, může ho sám dále přidělit někomu dalšímu. Opět pod účtem KROKODYL2 vyzkoušejte. |
Příklad: (Přihlašte se k původnímu účtu.) Přidělte právo SELECT a UPDATE k pohledu SKYPE_OSOBY uživateli KROKODYL2.
grant select,update on SKYPE_OSOBY to KROKODYL2; |
Nyní můžete vyzkoušet, zda uživatel KROKODYL2 může do sloupce SKYPE pohledu SKYPE_OSOBY vložit práznou hodnotu: přihlašte se jako uživatel KROKODYL2, najděte nějakého ze SKYPE_OSOBY a zjitěte jeho ID. |
update <schema_kde_jste_pohled_vytvořili>.SKYPE_OSOBY set SKYPE=NULL where ID=<zjištěné_ID>; |
| Grantovat můžeme jen práva, ke kterým máme GRANT OPTION, tedy k objektům, jichž jsme vlastníky, nebo nám bylo přiděleno právo with grant option . |
Následuje komplexní příklad na správu práv k jednotlivým záznamům.
Příklad: Tabulka ZAPISY bude uchovávat zápisy různých uživatelů, jejím vlastníkem bude KROKODYL2. Ostatní uživatelé mají vidět jen "své" záznamy. Přihlašte se jako KROKODYL2.
create table ZAPISY (
IDZAP int,
TEXT CLOB not null,
UZIV varchar2(100) default USER,
KDY DATE default sysdate,
constraint ZAPISY_PK primary key (IDZAP)); |
(Funkce USER je funkcí Oracle vracející uživatelské jméno přihlášeného uživatele.) |
create sequence ZAPISYID; |
(Sekvence je objekt Oracle sloužící k postupnému automatickému generování čísel int.) Pro utomatické generování IDZAP definujeme trigger: |
create or replace trigger ZAPISYIDNOVY before insert on ZAPISY
for each row
when (new.IDZAP is null)
begin
select ZAPISYID.nextval into :new.IDZAP from dual;
end; |
Na zkoušku vložíme jeden záznam a podíváme se na něj: |
insert into ZAPISY (TEXT) values ('Papala Pepička papáníčko, pokapala si kanapíčko.');
select * from ZAPISY; |
Definujeme pohled ZAPISYU k tomu, aby ukazoval jen zápisy přihlášeného uživatele. Podíváme se "tímto pohledem". |
create view ZAPISYU as
(select TEXT,KDY from ZAPISY where UZIV=USER)
with check option;
select * from ZAPISYU; |
Přidělíme uživateli KROKODYL1 práva k pohledu ZAPISYU. |
grant all on ZAPISYU to KROKODYL1; |
Přihlašte se jako KROKODYL1. Podíveje se pohledem ZAPISYU. |
select * from KROKODYL2.ZAPISYU; |
Nejsou vidět žádné záznamy. Vložíme jeden zápis. Podíváme se. |
insert into KROKODYL2.ZAPISYU (TEXT) values ('Babička dnes nepřijde.');
select * from KROKODYL2.ZAPISYU; |
Přihlašte se opět jako KROKODYL2. Podíváme se. |
select * from ZAPISYU;
select * from ZAPISY; |
Ukliďte po sobě... |
drop table ZAPISY;
drop sequence ZAPISYID;
drop view ZAPISYU; |
< Řídící příkazy | SQL postupně | REVOKE >