PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 22/02/2010 16:04:11

sophonie
Membre

Trigger permettant l'ajout automatique d'un record

Bonjour à toutes et à tous,

J'ai crée un trigger permettant d'ajouter automatiquement une ligne dans la table authentification
lors de l'ajout d'un nouvel utilisateur.
Cependant, j'ai un message d'erreur lors de l'execution de la requête INSERT INTO users VALUES ...
Néanmoins voici le script PL/pgSQL permettant un ajout dans la table authentification.

CREATE OR REPLACE FUNCTION ajout_auth() RETURNS trigger AS $ajout_auth$
BEGIN
	RAISE NOTICE 'ajout du client en cours ...';
	IF (TG_OP = 'INSERT') THEN
	INSERT INTO authentification (auth_id, auth_login, auth_passwd, auth_dtecreation, auth_dtelastconnect, auth_actif) VALUES
	((SELECT COALESCE (MAX(auth_id),0) + 1 FROM authentification),lower(NEW.user_nom), initcap(NEW.user_prenom), CURRENT_DATE, CURRENT_DATE, true);
	RETURN NEW;	
	END IF;
END;
$ajout_auth$ LANGUAGE plpgsql;

CREATE TRIGGER ajout_auth AFTER INSERT ON users
	FOR EACH ROW
	EXECUTE PROCEDURE ajout_auth();

Sous psql en exécutant la requête suivante :

INSERT INTO users VALUES ((SELECT COALESCE (MAX(user_id),0) + 1 FROM users), 'DURAND','renaud','1969-04-11','renaud.durand@businessdecision.com','h','9,rue de Condé','','Bordeaux','33000', 1,11,'0556001260');

J'ai le message d'erreur suivant :

ERREUR:  une instruction insert ou update sur la table « users » viole la contrainte de clé
étrangère « fk_users_idauth »
DÉTAIL : La clé (user_idauth)=(11) n'est pas présente dans la table « authentification ».

La valeur 11 (champ idauth dans la table user) correspond à l'id que devrait avoir le nouvel utilisateur
ajouté.
Si je ne mets pas 11, qu'elle valeur dois-je mettre?

Merci d'avance.
Sophonie.

Hors ligne

#2 22/02/2010 22:49:40

Marc Cousin
Membre

Re : Trigger permettant l'ajout automatique d'un record

J'ai l'impression que la foreign key est déclarée à l'envers : je présume que l'idée c'est de vérifier que les authentifications se rapportent bien à des users bien définis ? Si c'est le cas, la foreign key devrait être déclarée sur authentification, pas sur user.


Marc.

Hors ligne

#3 23/02/2010 15:28:04

sophonie
Membre

Re : Trigger permettant l'ajout automatique d'un record

Bonjour Marc Cousin,

Effectivement la phase de conception via la méthode MERISE n'a pas été correctement mis en oeuvre
pour cette relation.
Pour que mon trigger soit opérationnel, il faut que je lui indique de ce déclencher
avant(BEFORE) l'insertion dans la table users au lieu de après(AFTER).

Ce qui donne :

CREATE TRIGGER ajout_auth BEFORE INSERT ON users

Etant donné que des tuples sont déjà présents, je continuerai avec cette "coquille".

Merci encore.
Sophonie.

Dernière modification par sophonie (23/02/2010 15:29:29)

Hors ligne

#4 23/02/2010 18:31:49

sophonie
Membre

Re : Trigger permettant l'ajout automatique d'un record

Etant donné que des tuples sont déjà présents, je continuerai avec cette "coquille"

Je ne continuerai pas avec cette coquille, car les problèmes se représenteront par la suite
ultérieurement.

J'ai donc redéfini mon modèle conceptuel des données afin qu'il y ai davantage de cohérence.

Bonne soirée.
Sophonie.

Hors ligne

Pied de page des forums