X-Original-To: pgsql-sql-postgresql.org@localhost.postgresql.org Received: from localhost (unknown [200.46.204.144]) by svr1.postgresql.org (Postfix) with ESMTP id 5E89F5443D for ; Wed, 4 May 2005 04:31:18 -0300 (ADT) Received: from svr1.postgresql.org ([200.46.204.71]) by localhost (av.hub.org [200.46.204.144]) (amavisd-new, port 10024) with ESMTP id 03165-09 for ; Wed, 4 May 2005 07:31:17 +0000 (GMT) Received: from wproxy.gmail.com (wproxy.gmail.com [64.233.184.205]) by svr1.postgresql.org (Postfix) with ESMTP id CE8C254451 for ; Wed, 4 May 2005 04:31:16 -0300 (ADT) Received: by wproxy.gmail.com with SMTP id 68so192412wra for ; Wed, 04 May 2005 00:31:17 -0700 (PDT) DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=beta; d=gmail.com; h=received:message-id:date:from:user-agent:x-accept-language:mime-version:to:subject:x-enigmail-version:content-type:content-transfer-encoding; b=ZsyvAAY2kWJIGbR4B0BlnMIevqaLfx7714OfGGpOxK53jrvRjffJUZghpiquJzLlTPAmXa/AVYMM6ikvS/yNkryHx7Pd02tuBRK3M7kX9HjTuHi6a1baibee9AjMJZRcbTIJ/Ai7Y0XuYDeRmN3NgckchkXLNg5HKSzWJAv6rgY= Received: by 10.54.47.40 with SMTP id u40mr22551wru; Wed, 04 May 2005 00:31:14 -0700 (PDT) Received: from ?1.255.51.14? ([213.140.22.65]) by mx.gmail.com with ESMTP id 6sm178663wrl.2005.05.04.00.31.11; Wed, 04 May 2005 00:31:12 -0700 (PDT) Message-ID: <42787A43.7030406@gmail.com> Date: Wed, 04 May 2005 09:31:15 +0200 From: Sonic User-Agent: Mozilla Thunderbird 1.0 (Windows/20041206) X-Accept-Language: it, it-it, en-us, en MIME-Version: 1.0 To: pgsql-sql@postgresql.org Subject: CASCADE and TRIGGER - Some weird problem X-Enigmail-Version: 0.91.0.0 Content-Type: text/plain; charset=ISO-8859-15; format=flowed Content-Transfer-Encoding: 7bit X-Virus-Scanned: by amavisd-new at hub.org X-Spam-Status: No, hits=1.326 tagged_above=0 required=5 tests=DNS_FROM_RFC_ABUSE, RCVD_BY_IP, UPPERCASE_50_75 X-Spam-Level: * X-Archive-Number: 200505/68 X-Sequence-Number: 21381 -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 hi, have a little problem with a trigger and the ON DELETE CASCADE statement. i'm working on a db that represents Users and Messages. A message can be owned by more than a user. if i delete a user all his related objects are deleted too (ON DELETE CASCADE), but if a message that this user owns is also owned by another user, it has not to be deleted. i just put ON DELETE CASCADE statement on foreign keys and thos seem to work. then i wrote a trigger to check if each message the user owns is owned by someone else. if it's not delete it! - ----------------------------------------------------------- - -----this is the code: CREATE TABLE OWNER( _LOGIN TEXT, PRIMARY KEY(_LOGIN) ); CREATE TABLE MESSAGE( _MESSAGE_ID TEXT, PRIMARY KEY(_MESSAGE_ID) ); CREATE TABLE ACCOUNT( _INDIRIZZO TEXT UNIQUE, _LOGIN TEXT, PRIMARY KEY(_INDIRIZZO,_LOGIN), FOREIGN KEY(_LOGIN)REFERENCES OWNER(_LOGIN) ON DELETE CASCADE); CREATE TABLE ACCOUNT_MESSAGE( _MSG TEXT, _INDIRIZZO TEXT, PRIMARY KEY(_MSG,_INDIRIZZO), FOREIGN KEY(_MSG)REFERENCES MESSAGE(_MESSAGE_ID), FOREIGN KEY(_INDIRIZZO)REFERENCES ACCOUNT(_INDIRIZZO) ON DELETE CASCADE); CREATE TABLE FOLDER( _PATH TEXT, _OWNER TEXT, PRIMARY KEY(_PATH), FOREIGN KEY(_OWNER)REFERENCES OWNER(_LOGIN) ON DELETE CASCADE); CREATE TABLE MSG_IN_FOLDER( _MSG TEXT, _FOLDER TEXT, PRIMARY KEY(_MSG,_FOLDER), FOREIGN KEY(_MSG)REFERENCES MESSAGE(_MESSAGE_ID), FOREIGN KEY(_FOLDER)REFERENCES FOLDER(_PATH) ON DELETE CASCADE); CREATE FUNCTION check_message() RETURNS trigger AS $check_MESSAGE$ BEGIN DELETE FROM MESSAGE WHERE _message_id IN ( SELECT _MSG FROM ACCOUNT_MESSAGE NATURAL JOIN msg_in_FOLDER WHERE _MSG = OLD._MSG GROUP BY _MSG HAVING count(*)=1 ); RAISE NOTICE 'Value of OLD._MSG %', OLD._MSG; RETURN NULL; END; $check_MESSAGE$ LANGUAGE plpgsql; CREATE TRIGGER check_message AFTER DELETE ON MSG_IN_FOLDER FOR EACH ROW EXECUTE PROCEDURE check_message(); - ------------------------------------------------- - --and these are some values: delete from OWNER; delete from ACCOUNT; delete from MESSAGE; delete from ACCOUNT_MESSAGE; delete from FOLDER; delete from MSG_IN_FOLDER; insert into OWNER (_login) values ('anna'); insert into OWNER (_login) values ('paolo'); insert into ACCOUNT values ('anna@gmail.com', 'anna'); insert into ACCOUNT values ('paolo@gmail.com', 'paolo'); insert into MESSAGE (_message_id) values ('1'); insert into MESSAGE (_message_id) values ('2'); insert into ACCOUNT_MESSAGE values ('1', 'anna@gmail.com'); insert into ACCOUNT_MESSAGE values ('1', 'paolo@gmail.com'); insert into ACCOUNT_MESSAGE values ('2', 'anna@gmail.com'); insert into FOLDER (_path, _OWNER) values ('c', 'anna'); insert into MSG_IN_FOLDER values ('1', 'c'); insert into MSG_IN_FOLDER values ('2', 'c'); select * from MESSAGE; - ---------- as you see there are 2 messages. message 1 is owned both by 'anna' and 'paolo'. message 2 is owned just by 'anna'. now what i want is that if i delete user 'anna' just message 2 is deleted. i guess i've done that with my trigger: ... CREATE FUNCTION check_message() RETURNS trigger AS $check_MESSAGE$ BEGIN DELETE FROM MESSAGE WHERE _message_id IN ( SELECT _MSG FROM ACCOUNT_MESSAGE NATURAL JOIN msg_in_FOLDER WHERE _MSG = OLD._MSG GROUP BY _MSG HAVING count(*)=1 ); RAISE NOTICE 'Value of OLD._MSG %', OLD._MSG; RETURN NULL; END; $check_MESSAGE$ LANGUAGE plpgsql; CREATE TRIGGER check_message AFTER DELETE ON MSG_IN_FOLDER FOR EACH ROW EXECUTE PROCEDURE check_message(); ... i'm also sure that values it process are right beacuse of that RAISE NOTICE 'Value of OLD._MSG %', OLD._MSG; but something seems to go wrong. all 'anna' stuff is deleted but not her message 2 ! DELETE FROM owner WHERE _login = 'anna'; SELECT * FROM message; can someone help me to understand why this is not done? i don't receive any error message from postgres... thanks paolo from italy sonicaaaa@gmail.com -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.0 (MingW32) iD8DBQFCeHpD8gTT7JZTWqIRAvc6AJ9yqXq4EOP+JZ4NJ+pekiwuqko0XACeMz/8 DBZdQevWM1emBodYH5QP0G4= =V6VW -----END PGP SIGNATURE-----