witam
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