ich möchte die Zugriffe auf meine Datenbank “kapseln”.
Ich habe mehrere Tabellen und mehrere Funktionen.
Ich möchte einen user anlegen der nur selects auf die tabellen machen kann UND SELECT * from func (also selbst definierte funktionen ausführen)
in der func allerdings geht es heiss her. insert, delete, update, create usw. usw.
ist das möglich ?
Ziel ist das Änderungen der Daten (insert, delete, creaste, updates) nur über die gekapselten funktionsaufrufe möglich sind.
oder muss ich dem user execute func rechte geben und in der function die grants immer wieder anpassen ? und kann ich überhaupt auf den aktuellen benutzer über eine variable innerhalb pl/pgsql zugreifen um das machen zu können ?
Du kannst als Superuser oder Besitzer der Tabelle eine Funktion mit ‘security definer’ schreiben, der auf der Tabelle arbeiten darf.
Mal grob:
Szenario: ich bin in meiner Testdatenbank
test=# select * from foo;
id | name
----+-------------
1 | batzenlurch
2 | akretschmer
3 | ads
(3 rows)
test=*# create or replace function update_foo(int, text) returns bool as $$begin update foo set name = $2 where id=$1; return 1;end;$$language plpgsql security definer;
CREATE FUNCTION
test=*# commit;
COMMIT
test=# \q
kretschmer@tux:~$ psql -U gast test
psql: FATAL: role "gast" does not exist
kretschmer@tux:~$ createuser gast
Shall the new role be a superuser? (y/n) n
Shall the new role be allowed to create databases? (y/n) n
Shall the new role be allowed to create more new roles? (y/n) n
kretschmer@tux:~$ psql -U gast test
Welcome to psql 8.3.6, the PostgreSQL interactive terminal.
Type: \copyright for distribution terms
\h for help with SQL commands
\? for help with psql commands
\g or terminate with semicolon to execute query
\q to quit
test=> select * from foo;
ERROR: permission denied for relation foo
test=!> rollback;
ROLLBACK
test=> select * from update_foo(2, 'Tamara');
update_foo
------------
t
(1 row)
test=*> commit;
COMMIT
test=> \q
kretschmer@tux:~$ psql test
Welcome to psql 8.3.6, the PostgreSQL interactive terminal.
Type: \copyright for distribution terms
\h for help with SQL commands
\? for help with psql commands
\g or terminate with semicolon to execute query
\q to quit
test=# select * from foo;
id | name
----+-------------
1 | batzenlurch
3 | ads
2 | Tamara
(3 rows)