1

Temat: Sprawdzenie użytkownika w grupie

Witam
Mam tabelkę z danymi
pole, kto_wpisal
dana1  Jolka
dana2  Maciek
dana3  Jurek

Potrzebuję takie zapytanie  Select * from tabele where kto_wpisal należy do grupy wywołujacego zapytanie.
Innymi słowy potrzebuję zapytanie które pozwoli pokazać użytkownikowi tylko te dane które wpisała osoba należąca do jego grupy.

Czy da się to zrobić prostym sposobem??
Z góry dzięki za pomoc
AdamP.

2

Odp: Sprawdzenie użytkownika w grupie

A co znaczy "osoba należąca do jego grupy"? gdzie tu są jakieś grupy bo ja widzę tylko użytkowników i dane które wprowadzili.

3

Odp: Sprawdzenie użytkownika w grupie

To znaczy mam np: dwie grupy
grupa1- do niej należy Janek, Jolka, Marek
grupa2 - do niej należy Janek, Maciek, Jurek

Janek widzi wszystko bo należy do obu grup, a pozostali tylko to co wpisali członkowie ich grup

Grupy w tabeli nie ma, ona jest w Postgresql. Akurat w tej bazie grupa i user nazywają sie Rloa z tym że user to Rola z możliwością logowania.

4

Odp: Sprawdzenie użytkownika w grupie

Uprzedzam, że moja znajomość SQL'a jest "poniżej średniej krajowej", więc pewnie znajdzie się ktoś, to napisze to ładniej. Do rzeczy:

\du
                                  List of roles
 Role name | Superuser | Create role | Create DB | Connections |    Member of    
-----------+-----------+-------------+-----------+-------------+-----------------
 grupa1    | no        | no          | no        | no limit    | {}
 grupa2    | no        | no          | no        | no limit    | {}
 janek     | no        | no          | no        | no limit    | {grupa1,grupa2}
 jolka     | no        | no          | no        | no limit    | {grupa1}
 jurek     | no        | no          | no        | no limit    | {grupa2}
 maciek    | no        | no          | no        | no limit    | {grupa2}
 marek     | no        | no          | no        | no limit    | {grupa1}
 postgres  | yes       | yes         | yes       | no limit    | {}
CREATE TABLE dane (pole_danych varchar(40), kto_wpisal varchar(20));
INSERT INTO dane VALUES ('aaaa', 'janek'), ('bbbb', 'jolka'), ('cccc', 'jurek'),
   ('dddd', 'maciek'), ('eeee', 'marek');

GRANT SELECT ON dane TO grupa1, grupa2; # domyślnie każda rola (PUBLIC) nie może wykonywać SELECT'a
# na obiektach (tutaj tabeli), których nie jest właścicielem

SET ROLE maciek;

SELECT * from dane WHERE kto_wpisal IN (SELECT DISTINCT pg_get_userbyid(member) FROM pg_auth_members
WHERE roleid IN (SELECT roleid FROM pg_auth_members WHERE member = (SELECT oid FROM pg_roles
WHERE rolname = current_user)));

 pole_danych | kto_wpisal 
-------------+------------
 aaaa        | janek
 cccc        | jurek
 dddd        | maciek


RESET ROLE;

Generalnie nie widzę innego drogi jak "błąkanie się" po katalogach systemowych, ale nie wykluczam, że istnieje bardziej elegancki sposób.

5

Odp: Sprawdzenie użytkownika w grupie

Dzięki, docelowo mam tak:
Grupa1- Janek, Maja, Jola, Stefan, Janusz
Grupa2 - Mirek, Alicja

Użytkownicy z grupy1 widzą tylko swoje, a z grupy2 widzą wszystkie

SELECT * from tabela WHERE
case when current_user IN (SELECT DISTINCT pg_get_userbyid(member) FROM pg_auth_members
WHERE member IN (SELECT member FROM pg_auth_members WHERE roleid = (SELECT oid FROM pg_roles
WHERE rolname = 'grupa2')))
then kto_wpisal like '%'
else
kto_wpisal IN (SELECT DISTINCT pg_get_userbyid(member) FROM pg_auth_members
WHERE roleid IN (SELECT roleid FROM pg_auth_members WHERE member = (SELECT oid FROM pg_roles
WHERE rolname = current_user))) end;

może zamiast kto_wpisal like '%'  dać kto_wpisal is not null - czy będzie szybciej ??

Jeżeli można coś poprawić to proszę pisać.

AdamP.

Ostatnio edytowany przez adamleon (2011-04-22 09:21:52)