<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Forum PostgreSQL - Uprawnienia]]></title>
	<link rel="self" href="http://forum.postgresql.org.pl/extern.php?action=feed&amp;tid=508&amp;type=atom"/>
	<updated>2010-12-03T19:00:17Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.postgresql.org.pl/viewtopic.php?id=508</id>
		<entry>
			<title type="html"><![CDATA[Odp: Uprawnienia]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=2288#p2288"/>
			<content type="html"><![CDATA[Tabela z mapowaniem nazwa_uzytkownika <-> id uzytkownika
[code]
create table users(username text, userid int);
insert into users values('dbuser',1);
[/code]

Tabela z danymi uzytkownikow kazdy moze edytowac tylko swoje dane
[code]
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;
[/code]

Widok i reguły za pomocą których będą wykonywane update'y i delete'y na tabeli
[code]
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);
[/code]

No i jak uzytkownik wykona takiego update'a
[code]
update _data set address='nowy user dbuser';
[/code]
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).]]></content>
			<author>
				<name><![CDATA[rski]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=26</uri>
			</author>
			<updated>2010-12-03T19:00:17Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=2288#p2288</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: Uprawnienia]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=2287#p2287"/>
			<content type="html"><![CDATA[Jeżeli byłby tylko możliwy przykład byłbym naprawdę bardzo wdzięczny.]]></content>
			<author>
				<name><![CDATA[SrS]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=1168</uri>
			</author>
			<updated>2010-12-01T21:43:38Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=2287#p2287</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Odp: Uprawnienia]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=2286#p2286"/>
			<content type="html"><![CDATA[No to rozwiązania mogą być takie
Zabierasz użytkownikom wszelkie prawa do aktualizacji tabel 
1)tworzysz funkcję (z opcją SECURITY DEFINER) za pomocą której będzie można aktualizować tabele. W samej funkcji definiujesz żeby użytkownik mógł zmieniać tylko swoje dane (albo poprzez jakiś warunek IF albo poprzez doklejanie do zapytań warunku userid=<identyfikator uzytkownika>)
2) Definiujesz widoki na tabelach i definiujesz na nich reguły (RULE) typu INSTEAD aby podczas próby aktualizacji widoku była aktualizowana określona tabela i tu też pewnie da się do polecenia aktualizującego dodac warunek userid=<identyfikator uzytkownika>

Jasno się wysłowiłem :)? Czy potrzebny będzie Ci jakiś przykład?]]></content>
			<author>
				<name><![CDATA[rski]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=26</uri>
			</author>
			<updated>2010-12-01T19:37:13Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=2286#p2286</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Uprawnienia]]></title>
			<link rel="alternate" href="https://forum.postgresql.org.pl/viewtopic.php?pid=2285#p2285"/>
			<content type="html"><![CDATA[Witam.
Mam taki oto problem. Mam przykładową bazę która ma tabelkę klienci, w tej tabelce mam id_użytkownika, jego dane. Moje pytanie brzmi w jaki sposób, ewentualnie przydałby mi się jakiś przykład mogę nadać uprawnienia użytkownikowi do edycji tylko i wyłącznie swoich danych w tabeli.
Powiedzmy że użytkownik który loguj się do bazy jest "zapisany" w tej tabeli jako osoba z id_użytkownika=5 i może on tylko i wyłącznie widzieć swoje dane, edytować i usuwać. Nie może on mieć wglądu do danych innych osób.]]></content>
			<author>
				<name><![CDATA[SrS]]></name>
				<uri>https://forum.postgresql.org.pl/profile.php?id=1168</uri>
			</author>
			<updated>2010-11-30T23:19:27Z</updated>
			<id>https://forum.postgresql.org.pl/viewtopic.php?pid=2285#p2285</id>
		</entry>
</feed>
