8791 sujets

Développement web côté serveur, CMS

Bonjour,

J'ai un petit problème avec un trigger.
Tout d'abord c'est la première que j'utilise cela donc soyez indulgent Smiley smile

Voilà, j'ai deux tables.
clic : id | site_dest
site_dest : id | url

Je n'ai le droit qu'à une seule requête. Donc je fais:
INSERT INTO clic VALUES ('','www.alasacreations.fr'); // ceci est un exemple ^^

Ensuite j'aimerai que si l'url n'existe pas dans la table 'site_dest' l'entrée soit effacée.

Voici ce que j'ai fait :

delimiter //
CREATE TRIGGER ifNotExist AFTER INSERT ON clic
FOR EACH ROW
BEGIN
IF (SELECT COUNT url FROM site_dest WHERE url = clic.NEW.site_dest) = 0 THEN
DELETE FROM clic WHERE site_dest = NEW.site_dest;
END IF;
END//
delimiter ;

Du coup même quand l'url est bonne ça l'efface (ou ça ne la rentre pas)...

Pourriez-vous m'aider ?
Modifié par sorensprod (20 Apr 2009 - 15:23)
Salut et bienvenue sur le forum, Smiley smile

première petite chose : comme indiqué dans l'Aide les liens en signature ne sont pas tolérés et j'ai donc modifié ton profil. Smiley cligne

Sinon il me semble qu'il serait bien plus logique de faire un trigger BEFORE INSERT et de ne pas faire l'écriture si l'enregistrement existe déjà !

Quelque chose comme ça (pas testé) :
delimiter //
create or replace trigger ifNotExist 
before insert on clic
for each row
declare
  combien number;
begin
  select count(*) into combien 
  from site_dest
  where url = :new.site_dest;
  if (combien == 0 ) then
    raise_application_error(-99999,'Site inexistant');
  end if;
end//
delimiter ;

Modifié par Heyoan (20 Apr 2009 - 11:02)
Désolé pour le lien je ne savais pas Smiley cligne Lu trop vite ^^

En fait j'avais AFTER parce que je voyais pas comment ne pas exécuter la requête si ce n'était pas bon.
Ton raise_application_error n'exécute pas la requête par la suite ?
sorensprod a écrit :
Ton raise_application_error n'exécute pas la requête par la suite ?
Non... mais je suis parti de l'idée que tu étais sous oracle ! Si tu es sur mysql ça ne fonctionnera pas ! Smiley ohwell
Aïe !

Dans ce cas il me semble qu'il existe des ruses pour le remplacer dans mysql... ruses que je ne connais pas...

Et sinon je ferais :
delimiter //
create or replace trigger ifNotExist 
after insert on clic
for each row
declare
  combien number;
begin
  select count(*) into combien 
  from site_dest
  where url = :new.site_dest;
  if (combien == 0 ) then
    DELETE FROM clic WHERE site_dest = NEW.site_dest;
  end if;
end//
delimiter ;
A noter que ta première syntaxe fonctionnerait peut-être en remplaçant = 0 par == 0 Smiley cligne
Bon au final ça ne marche pas mais j'ai fait autrement. Du coup j'ai découvert que j'étais pas au point sur les bdd d'ailleurs ^^

Merci de ton aide tout de même Smiley cligne