GRANT
s på forskellige objekter er adskilte. GRANT
ing på en database GRANT
rettigheder til skemaet indeni. Tilsvarende GRANT
ing på et skema giver ikke rettigheder til tabellerne indeni.
Hvis du har rettigheder til SELECT
fra en tabel, men ikke retten til at se den i skemaet, der indeholder den, så kan du ikke få adgang til tabellen.
Rettighedstesten udføres i rækkefølge:
Do you have `USAGE` on the schema?
No: Reject access.
Yes: Do you also have the appropriate rights on the table?
No: Reject access.
Yes: Check column privileges.
Din forvirring kan opstå som følge af, at public
skemaet har en standard GRANT
af alle rettigheder til rollen public
, som hver bruger/gruppe er medlem af. Så alle har allerede brug for det skema.
Sætningen:
(forudsat at objekternes egne privilegiekrav også er opfyldt)
Siger at du skal have USAGE
på et skema for at bruge objekter i det, men med USAGE
på et skema er ikke i sig selv tilstrækkeligt til at bruge objekterne i skemaet, du skal også have rettigheder til selve objekterne.
Det er ligesom et bibliotekstræ. Hvis du opretter en mappe somedir
med filen somefile
i den, indstil den så, at kun din egen bruger kan få adgang til mappen eller filen (tilstand rwx------
på dir, mode rw-------
på filen), så kan ingen andre liste mappen for at se, at filen eksisterer.
Hvis du skulle give verdenslæserettigheder til filen (tilstand rw-r--r--
), men ikke ændre mappetilladelserne, det ville ikke gøre nogen forskel. Ingen kunne se filen for at læse den, fordi de ikke har rettighederne til at vise mappen.
Hvis du i stedet indstiller rwx-r-xr-x
på biblioteket, indstille det, så folk kan liste og krydse biblioteket, men ikke ændre filtilladelserne, kunne folk liste filen, men kunne ikke læse det fordi de ikke ville have adgang til filen.
Du skal indstille begge tilladelser til, at folk rent faktisk kan se filen.
Det samme i s. Du skal bruge både skemaet USAGE
rettigheder og objektrettigheder til at udføre en handling på et objekt, såsom SELECT
fra et bord.
(Analogien falder lidt ned i, at PostgreSQL ikke har sikkerhed på rækkeniveau endnu, så brugeren kan stadig "se" at tabellen eksisterer i skemaet ved at SELECT
ing fra pg_class
direkte. De kan dog ikke interagere med det på nogen måde, så det er bare "listedelen", der ikke er helt den samme.)