witam

posiadam triggera wygladajacego tak

  1. CREATE OR REPLACE FUNCTION cheange_parent(int8, int8)
  2. RETURNS text AS $BODY$
  3. declare
  4. row record;
  5. user ALIAS FOR $1;
  6. parent ALIAS FOR $2;
  7. BEGIN INSERT
  8. INTO temida_connections
  9. (parent_id, child_id, depth) VALUES (parent, user, 1);
  10. INSERT
  11. INTO temida_connections
  12. (parent_id, child_id, depth)
  13. SELECT parent_id, user, depth + 1
  14. FROM temida_connections
  15. WHERE child_id = parent AND depth > 0;
  16. FOR row IN SELECT p.child_id, p.parent_id
  17. FROM temida_users
  18. k,temida_connections p WHERE parent_id IN (SELECT child_id
  19. FROM temida_connections
  20. WHERE parent_id = user) AND k.user_id = p.child_id AND depth=1 ORDER BY parent_id,child_id
  21. LOOP
  22. INSERT
  23. INTO temida_connections
  24. (parent_id, child_id, depth) VALUES (row.child_id, row.parent_id, 1);
  25. INSERT
  26. INTO temida_connections
  27. (parent_id, child_id, depth)
  28. SELECT parent_id, row.parent_id, depth + 1
  29. FROM temida_connections
  30. WHERE child_id = row.child_id AND depth > 0;
  31. END LOOP;
  32. RETURN NULL;
  33. END;
  34. $BODY$
  35. LANGUAGE 'plpgsql' VOLATILE;
  36. ALTER FUNCTION cheange_parent(int8, int8) OWNER TO postgres;


moj problem polega na tym ze nie wiem jak zachowac wyniki zapytania

  1. SELECT p.child_id, p.parent_id
  2. FROM temida_users
  3. k,temida_connections p WHERE parent_id IN (SELECT child_id
  4. FROM temida_connections
  5. WHERE parent_id = user) AND k.user_id = p.child_id AND depth=1 ORDER BY parent_id,child_id


tak aby moc je wykorzystac 2 razy w petli for w 1 trigerze

gdyz na poczatku triggera musze wybrac te wiersze i przeoprowadzic petle

  1. FOR row IN SELECT p.child_id, p.parent_id
  2. FROM temida_users
  3. k,temida_connections p WHERE parent_id IN (SELECT child_id
  4. FROM temida_connections
  5. WHERE parent_id = user) AND k.user_id = p.child_id AND depth=1 ORDER BY parent_id,child_id
  6. LOOP
  7. DELETE
  8. FROM temida_connections
  9. WHERE child_id = row.child_di
  10. END LOOP;


no i teraz jak pozniej jeszcze raz wykonam zapytanie:

  1. SELECT p.child_id, p.parent_id
  2. FROM temida_users
  3. k,temida_connections p WHERE parent_id IN (SELECT child_id
  4. FROM temida_connections
  5. WHERE parent_id = user) AND k.user_id = p.child_id AND depth=1 ORDER BY parent_id,child_id


nie będzie ono juz posidalo tych wyników ktore poprzednio...


mam nadzieje ze wyrazilem sie w miare jasno smile.gif