Nur Zugriff auf bestimmte Funktionen erlauben

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

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)

Der aktueller Benutzer ist übrigens:

test=> select current_user;
 current_user
--------------
 gast
(1 row)

Andreas

Spitzenmäßig :smiley:

Astreines HowTo

Vielen lieben Dank