hallo zusammen,
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 ?
Für hilfreiche tipps bin ich dankbar.
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
Der aktueller Benutzer ist übrigens:Code: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)
Code:test=> select current_user; current_user -------------- gast (1 row)
Andreas
--
https://www.xing.com/profile/Andreas_Kretschmer7ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
Spitzenmäßig
Astreines HowTo
Vielen lieben Dank
Links: Tobias Bauer - IT- und Funkdienstleistungen - Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen - Funkforum
Lesezeichen