Vous n'êtes pas identifié(e).
Pages : 1
Ok, merci beaucoup. Je vous envoi ça ce soir vers 19h.
Pas de soucis, tout ça est déjà prêt et prévu, mais je préférerai ne pas le rendre public, je peux vous l'envoyer par mail ou autre moyen?
Bien évidemment la solution, si elle existe sera mise sur le forum.
Je reposte à nouveau espérant que quelqu'un puisse m'apporter une réponse car je suis vraiment coincé.
Je me rends compte avoir oublié de mentionné que la table t_product à laquelle fait référence la table t_order_product est alimentée par 4 tables enfants. Est-ce que le problème pourrez venir de là?
Je résume, ma table t_order_product est relié (via la possession d'une clé étrangére) à une table t_order et une table t_product (la même qui est en relation avec 4 tables enfants). Cette dernière table posséde 2 clés étrangères la reliant à une table t_picture, t_catégorie.
La question reste la même: pourquoi j'ai le message d'erreur ci dessous quand j'essaye d'insérer une nouvelle ligne dans ma table t_order_product?
ERREUR: une instruction insert ou update sur la table "t_order_product" viole la contrainte de clé étrangère "product_idop"
DETAIL: La clé (product_id)= (2) n'est pas présente dans la table "t_product".
D'avance merci pour toutes vos réponses.
Il y en a eu mais il n'y en a plus. Le problème ne vient donc pas de là.
Je ne comprends vraiment pas pourquoi cela ne marche pas.
Toute les idées sont les bienvenues.
Merci d'avance.
Il me renvoie 1 (une entrée).
Et, très interessant si je modifie mon trigger le passant de "after insert or update..." à "before insert or...".
Il ne me renvoi pas d'erreur mais bien évidemment il ne conserve pas la ligne rentrée dans la table t_order_product" puisque la fonction associée au trigger comprend un "return null", si je met "return new", l'erreur est a nouveau renvoyée.
Est-ce que cela permet d'avancer?
Effectivement, désactiver le trigger n'y fait rien. Cependant il existe bien une ligne pour laquelle l'id_product (qui correspond au champ product_id en tant que clé étrangère dans la table t_order_product) est égal à 2 dans la table t_product. Voilà pourquoi je ne comprends pas l'erreur.
Est-ce que vous auriez une idée? Avez vous besoin d'informations supplémentaires pour pouvoir me répondre?
Merci pour la petite explication du billet. Ce n'est donc pas un bug.
Merci à vous deux pour vos réponses rapides.
Pour info j'ai bien compris ce qu'est l'objet NEW et je l'avait utilisé comme tel dans un précédent trigger:
Create or replace function ins_stock () returns opaque as $$
Begin
UPDATE t_product
Set stock_web=stock_web - new_product.quantity
Where id_product = insert_product_id;
Return null;
End;
$$ language plpgsql;
Create trigger ins_stock_O
after Insert on t_order_product
for each row execute procedure ins_stock();
Mais comme cela me renvoyait une erreur, j'ai essayé d'adapter du haut de ma petite expérience un code écrit pour mysql serveur ce qui à donné le triste résultat que j'ai publié au dessus.
Aprés avoir pris en compte vos corrections mon programme me renvoi exactement la même erreur lorsque j'essaye de rentrer une nouelle ligne dans ma table t_order_product à savoir:
ERREUR: une instruction insert ou update sur la table "t_order_product" viole la contrainte de clé étrangère "product_idop"
DETAIL: La clé (product_id)= (2) n'est pas présente dans la table "t_product".
Voilà le trigger corrigé:
CREATE OR REPLACE FUNCTION gest_stock()
RETURNS trigger AS
$BODY$
declare stock varchar;
declare id_prod integer;
declare q integer;
begin
select into q new.quantity;
select into id_prod new.product_id;
update t_product
set stock_web = stock_web + q
where id_product=id_prod;
q :=0;
select into q old.quantity;
select into id_prod old.product_id;
update t_product
set stock_web = stock_web - q
where id_product=id_prod;
return null;
end;
$BODY$
LANGUAGE 'plpgsql' VOLATILE
COST 100;
ALTER FUNCTION gest_stock() OWNER TO postgres;
Mais j'ai lu ici http://blog.guillaume.lelarge.info/inde … g%C3%A8res (c'est d'ailleurs votre blog Gleu) , si j'ai bien compris, qu'il y avait un problème sous postgres avec des trigger qui désactivé les clés étrangères.
Est-ce que ce que je cherche à faire est impossible?
La version de postgreSQL que j'utilise: 8.4
Julien
Bonjour,
Je suis plus ou moins débutant sur postgres. Je conçois actuellement une base de données pour la gestion de stock.
J'ai donc créer une table produit:
CREATE TABLE t_product
(
id_product bigserial NOT NULL,
code character varying(4),
"name" character varying(50) NOT NULL,
description character varying(250) NOT NULL,
price_ht double precision NOT NULL,
stock_web integer NOT NULL,
picture_id integer,
category_id integer NOT NULL,
CONSTRAINT id_product PRIMARY KEY (id_product),
CONSTRAINT category_idep FOREIGN KEY (category_id)
REFERENCES t_category (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT picture_idp FOREIGN KEY (picture_id)
REFERENCES t_picture (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITH (
OIDS=FALSE
);
ALTER TABLE t_product OWNER TO postgres;
Une table commande:
CREATE TABLE t_order
(
id serial NOT NULL,
create_date date NOT NULL,
price_ht double precision NOT NULL,
user_id integer NOT NULL,
CONSTRAINT order_id PRIMARY KEY (id),
CONSTRAINT user_ido FOREIGN KEY (user_id)
REFERENCES t_user (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITH (
OIDS=FALSE
Et une table permettant le lien entre commande et produit:
CREATE TABLE t_order_product
(
id serial NOT NULL,
product_id integer NOT NULL,
quantity integer,
price_ht double precision NOT NULL,
order_id integer NOT NULL,
CONSTRAINT order_product_id PRIMARY KEY (id),
CONSTRAINT order_idop FOREIGN KEY (order_id)
REFERENCES t_order (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT product_idop FOREIGN KEY (product_id)
REFERENCES t_product (id_product) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITH (
OIDS=FALSE
);
ALTER TABLE t_order_product OWNER TO postgres;
Aprés plusieurs heures de recherche sur le net et d'essai, je n'ai pas réussi à concevoir un trigger et fonction associé qui permettrait de mettre à jour la champs stock_web de la table t_product à partir de la quantité commandée, renseignée dans le champ quantity de la table t_order_product. Tout ce que j'ai trouvé était à executer sous oracle ou mysql serveur:
http://www.sqlfr.com/codes/TRIGGER-MAJ_48866.aspx
Voilà ou j'en suis actuellement:
DROP FUNCTION gest_stock()cascade;
CREATE OR REPLACE FUNCTION gest_stock()
RETURNS opaque AS
$BODY$
declare stock varchar;
declare id_prod integer;
declare q integer;
begin
select into q new.quantity
where id_prod = new.product_id;
update t_product
set stock_web = stock_web + q
where id_product=id_prod;
q = 0;
select into q old.quantity
where id_prod = product_id;
update t_product
set stock_web = stock_web - q
where id_product=id_prod;
return null;
end;
$BODY$
LANGUAGE 'plpgsql' VOLATILE
COST 100;
ALTER FUNCTION gest_stock() OWNER TO postgres;
CREATE TRIGGER gestion_stock
after INSERT or delete or update
ON t_order_product
FOR EACH ROW
EXECUTE PROCEDURE gest_stock();
Ca ne marche bien évidemment pas.
Merci d'ores et déjà pour toute l'aide et les réponses que vous pourrez m'apporter.
Pages : 1