ugrás a tartalomhoz

Postgresql kérdés

piszur · 2009. Szep. 21. (H), 14.27
Alkalmazások fejlesztésénél próbáljuk azt az alapelvet követni, hogy az adatbázisok kezelésénél amit lehet, az adatbáziskezelőre bízzunk (fejlesztési környezet perl és postgresql). A Postgresql ezt remekül támogatja, szépen ki is dolgoztam a megszorításokat, szabályokat, triggereket.

Egy dologba viszont beletört a bicskám, érdekelne, hogy Ti hogyan oldanátok ezt meg. Természetesen az alkalmazás szintjén megvalósítottuk, de nyugodtabb lennék, ha ezt is adatbázis-szinten kezelnénk...

___
A probléma:

Adott egy kapcsoló-tábla, amely tárolja, hogy mely felhasználói csoportba mely felhasználók tartoznak:

group_user | group_id | user_id |
---------------------------------
1 | 1 | 2 |
2 | 1 | 3 |
3 | 1 | 6 |
4 | 1 | 7 |

A példában a 2,3,6,7 es user_id-jú felhasználók az 1-es group_id-jú csoportba tartoznak.

A felhasználói felületen checkbox-ok segítségével kijelölhetőek, hogy kik az adott csoport tagjai. Legyenek mondjuk az 3,6,8,1 felhasználók kijelölve, ekkor tehát törölni kell a 2,7 es usert, és felvinni a 8,1 usert. A változtatás után ezt szeretném látni:

group_user | group_id | user_id |
---------------------------------
2 | 1 | 3 |
3 | 1 | 6 |
5 | 1 | 8 |
6 | 1 | 1 |

___
Jelenleg a Perl kétszer hívja az adatbázis kezelőt: egyszer törli a felesleges tagokat, egyszer beszúrja az újakat.
E helyett szeretném egy postgresql-függvényhívással megoldani a dolgot, ahol átadom a kért csoport azonosítót valamint a felhasználó-azonosítókat egy tömbben (vagy record-ként) és a függvény ezek alapján végrehajtja a fentieket.

___
A kérdésem, hogy hogyan oldjam ezt meg? (Persze az is lehet válasz, hogy túlbonyolítom, és ezt igenis a Perl szintjén kell megoldani :-P ).

Szerintetek?
 
1

altalanos velemeny

carstepPCE · 2009. Szep. 21. (H), 14.42
Szia, nem ismerem a PostgreSql-t, de feltetelezem lehet tarolt eljarasokat irni, amelyek izolalt (egyazon) tranzakcioban futnak es fogadnak parametereket. A Perlben megirt logikat itt is lehet alkalmazni. Anno MSSQL-ben 2003 ez nem volt problema.

-cs-
Sanyi
2

Én egy egyszerű tárolt

virág · 2009. Szep. 22. (K), 09.41
Én egy egyszerű tárolt eljárással oldanám meg, a PG-ben ez tökegyszerű :)

Ezt most írtam neked:

CREATE OR REPLACE FUNCTION test(ids character varying)
  RETURNS integer AS
$BODY$DECLARE 
i integer;
temp_array varchar[];
BEGIN

   temp_array = string_to_array( ids, '|');

  FOR i IN 1..array_upper( temp_array , 1) LOOP
	
	RAISE NOTICE 'elem: % ', temp_array[i] ;

  END LOOP;
 
RETURN 1;
END;$BODY$




így kell meghívni:

select test('1|2|3|4|5|65|99|78|92');

ezzel pl. átatod neki a felhasználók azonosítóit, amit a tárolt eljárás átalakít tömbbé és azon végiglépkedsz, persze ez egy triviális megoldás - csak példa. És más megoldások is vannak!