w swoim systemie zaimplementowałem http://depesz.com/various-sqltrees-implementation.php dla drzewek
probuje wlasnie napisac f-cje do usuwania i zmiany rodzica na drzewku
i cos nie zabardzo mi wychodzi, tzn usuwanie ma polegac na tym ze zanim
uzytkownik zostanie usuniety z bazy i z drzewa to musi nastapic zmiana
rodzica dla jego dzieci na wybrenego rodzica przez uzytkownika, co za
tym idze cale drzewo podpiete pod niego ma zostac przepiete do nowego
uzytkownika, baza to PostgreSQL 7.4.6
baza wyglada tak:
CREATE TABLE t_connections ( parent_id int8, child_id int8, depth int8, CONSTRAINT t_connections_user_child_fkey FOREIGN KEY (child_id) REFERENCES t_users (user_id) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION, CONSTRAINT t_connections_user_id_fkey FOREIGN KEY (parent_id) REFERENCES t_users (user_id) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION ) CREATE TABLE t_users ( user_id int8 NOT NULL DEFAULT NEXTVAL('t_users_user_id_seq'::regclass), user_parent int8, user_name char(60), CONSTRAINT t_users_pkey PRIMARY KEY (user_id), CONSTRAINT t_users_user_id_key UNIQUE (user_id) ) WITHOUT OIDS; CREATE TRIGGER add_connections AFTER INSERT ON t_users FOR EACH ROW EXECUTE PROCEDURE add_connections(); CREATE OR REPLACE FUNCTION add_connections() RETURNS "trigger" AS $BODY$DECLARE BEGIN INSERT INTO t_connections (parent_id, child_id, depth) VALUES (currval('t_users_user_id_seq'),currval('t_users_user_id_seq'),0); IF NEW.user_parent <> currval('t_users_user_id_seq') THEN INSERT INTO t_connections (parent_id, child_id, depth) VALUES (NEW.user_parent, currval('t_users_user_id_seq'), 1); END IF; INSERT INTO t_connections (parent_id, child_id, depth) SELECT parent_id, currval('t_users_user_id_seq'), depth + 1 FROM t_connections WHERE child_id = NEW.user_parent AND depth > 0; RETURN NEW; END; $BODY$ LANGUAGE 'plpgsql' VOLATILE; ALTER FUNCTION add_connections() OWNER TO postgres;
z góry dziekuje za pomoc