Vous n'êtes pas identifié(e).
Bonsoir,
Je viens vous demander de l'aide car dans le cadre d'un projet de deuxièmes années de DUT informatique, je dois créer une base de données pour un site WEB.
Cependant je suis face à un problème :
j'ai une table compte et une table Groupe, l'attribut compte du groupe fait référence à un ID de compte.
Cependant lors de la création d'un trigger pour supprimer là/les lignes du groupe correspondant à l'id du compte que je veux supprimer pour éviter de violer la contraint de clef étrangère du groupe.
J'utilise dans mon trigger la variable OLD pour retrouver l'ID du compte que je veux supprimer pour supprimer les groupes possédant cette Id dans leurs attributs GRO_Compte mais je ne peux pas car OLD n'a pas par l'attribut COM_id...
Si vous avez des pistes pour régler mon problème je vous en remercie !
Cordialement,
Clément CRAMBERT
La configuration des tables et de la fonction trigger :
CREATE TABLE atm.t_compte_com
(
com_id serial NOT NULL,
com_login character varying(50) NOT NULL,
com_password character varying(50) NOT NULL,
com_email character varying(100) NOT NULL,
com_estadmin boolean,
com_estgroupe boolean,
com_estproprietaire boolean,
com_enattente boolean DEFAULT true,
com_datedecreation date,
CONSTRAINT com_compte_pk PRIMARY KEY (com_login, com_password, com_email),
CONSTRAINT t_compte_com_com_id_key UNIQUE (com_id)
);
CREATE TABLE atm.t_groupe_gro
(
gro_id serial NOT NULL,
gro_nom character varying(200) DEFAULT NULL::character varying,
gro_pays character varying(50) DEFAULT NULL::character varying,
gro_dateformation integer,
gro_premierediscographie integer,
gro_compte integer,
CONSTRAINT gro_groupe_pk PRIMARY KEY (gro_id),
CONSTRAINT gro_groupe_fk1 FOREIGN KEY (gro_compte)
REFERENCES atm.t_compte_com (com_id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
CREATE OR REPLACE FUNCTION atm."supprimerCompte"()
RETURNS trigger AS
$BODY$
BEGIN
IF EXISTS (select * from atm.t_groupe_gro where gro_compte=OLD.t_compte_com.com_id) then
delete from atm.t_groupe_gro where gro_compte=OLD.com_id;
END IF;
RETURN OLD;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
Hors ligne
Bonjour, quand on crée une contrainte, on peut lui dire ‹on delete cascade›. Je pense que c'est ce que vous cherchez.
Marc.
Hors ligne
D'une façon plus générale, merci de donner le vrai message d'erreur complet lors d'une demande de ce type, et non pas une interprétation. Là, en regardant la fonction, je me dis que le problème vient du premier appel à com_id vu que vous faites un OLD.t_compte_com.com_id alors qu'il faudrait faire un OLD.com_id. Mais peut-être est-ce un changement de dernière minute suite au problème rencontré... difficile de le dire sans avoir le message d'erreur complet (et un ensemble complete de requêtes pour reproduire le problème, ce qui n'est pas forcément le cas là, vu qu'il manque l'ajout du trigger à la table, ce qui n'est pas forcé, tout dépend du vrai message d'erreur).
Ceci étant dit, je suis d'accord avec Marc. Pas besoin de trigger pour ça, il y a une fonctionnalité native qui couvre ce besoin.
Guillaume.
Hors ligne
Désolé de ne pas avoir été assez précis dans ma question, cependant je vous remercie car la solution de modifier ma contrainte avec l'option "ON DELETE CASCADE"
fonctionne parfaitement.
Hors ligne