Tabela z mapowaniem nazwa_uzytkownika <-> id uzytkownika
create table users(username text, userid int);
insert into users values('dbuser',1);
Tabela z danymi uzytkownikow kazdy moze edytowac tylko swoje dane
create table data(userid int, address text);
insert into data values(1,'ulica dbusera');
insert into data values(2,'ulica innego dbusera');
revoke insert,update,delete on data from public;
revoke insert,update,delete on data from dbuser;
Widok i reguły za pomocą których będą wykonywane update'y i delete'y na tabeli
create view _data as select * from data;
grant insert,update,delete,select on _data to public;
create rule r_update as on update to _data do instead
update data set address=NEW.address where userid in (select userid from
users where username=user);
create rule r_delete as on delete to _data do instead
delete from data where userid in (select userid from users where
username=user);
No i jak uzytkownik wykona takiego update'a
update _data set address='nowy user dbuser';
to reguła (w tym wypadku reguła r_update) doklei do niego warunek 'userid in (...)'
Jeśli w twoim przypadku użytkownik to to samo co użytkownik bazy danych to
możesz zrezygnować z identyfikatorów użytkowników i tabeli z mapowaniem i uprości się warunek w regułach do czegoś w stylu 'username=current_user' (username byłoby zamiast userid)
To taki przykład na prędko, który nie koniecznie zadziała gdy użytkownik wykona na przykład update z warunkiem WHERE (należałoby troche zmodyfikowac reguły żeby to zadziałało). Ale ponieważ ja leniwy jestem z reguły i ciężko mi się jest zmusić do wolontariatu to nie chce mi się tego robić. Zresztą przecież to sama frajda rozwiązywać problemy nie ?
Rozwiązania z procedurami nie zamieszczam bo też trochę z tym roboty (trochę, znaczy więcej niż z regułami).