Précédent   Forum des professionnels en informatique > Bases de données > MySQL > SQL Procédural
SQL Procédural Forum d'entraide sur les triggers, les procédures stockées et les fonctions en MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 25/05/2011, 15h52   #1
Membre confirmé
 
Avatar de Pymento
 
Homme
Ingé. Info.
Inscription : janvier 2008
Messages : 338
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 24
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingé. Info.

Informations forums :
Inscription : janvier 2008
Messages : 338
Points : 273
Points : 273
Par défaut Trigger Cascade delete

Bonjour, je débute dans les triggers, je vous explique succinctement mon objectif: emuler un "cascade on delete" étant donné que j'ai du utiliser une table MyIsam.

Donc j'ai deux table une innoDB l'autre Isam, je veut simplement quand je supprime une ligne sur table1 supprimer la ligne correspondante par l'id dans table2.

Code :
1
2
3
4
5
6
 
DELIMITER $$
CREATE TRIGGER before_delete_element
BEFORE DELETE ON elements
DELETE FROM file_info WHERE  table1.id=table2.id
DELIMITER ;
J'execute ça dans phpMyADmin dans la section SQL, et il me dit OK c'est bon tout va bien, par contre forcément, rien ne marche(SHOW TRIGGERS ne me renvoi rien). Et impossible d'y mettre la main dessus, je ne sais pas ou ça va. Si quelqu'un pourrai en premier temps me corriger ma requête et m'expliquer comment "gérer" les triggers dans mysql.

Merci d'avance.
__________________
Memento Quia Pulvis Es, Et In Pulverem ReverteriS
Pymento est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 11h22   #2
Membre confirmé
 
Avatar de Pymento
 
Homme
Ingé. Info.
Inscription : janvier 2008
Messages : 338
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 24
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingé. Info.

Informations forums :
Inscription : janvier 2008
Messages : 338
Points : 273
Points : 273
Bon j'ai semble-t-il trouvé la bonne requête,
*


Code :
1
2
3
4
5
6
7
8
delimiter $$
CREATE TRIGGER delete_cascade_element
AFTER DELETE ON elements
FOR EACH ROW
BEGIN
DELETE FROM file_info WHERE file_id=Old.id
END$$
delimiter ;
Mais j'ai un soucis de syntaxe près de END ligne 6 d'après phpMyAdmin.
J'ai essayé tout ce que j'ai trouvé comme délimiter sur le net mais toujours la même erreur.
__________________
Memento Quia Pulvis Es, Et In Pulverem ReverteriS
Pymento est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 12h18   #3
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 848
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 848
Points : 1 325
Points : 1 325
salut,

il manque le ; à la fin de la ligne
__________________
Eric Dureuil, développeur web, c/c++, java indépendant
soyons
pensez à mettre et
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 14h09   #4
Membre confirmé
 
Avatar de Pymento
 
Homme
Ingé. Info.
Inscription : janvier 2008
Messages : 338
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 24
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingé. Info.

Informations forums :
Inscription : janvier 2008
Messages : 338
Points : 273
Points : 273
Code :
1
2
3
4
5
6
7
8
9
 
delimiter $$
CREATE TRIGGER delete_cascade_element
AFTER DELETE ON elements
FOR EACH ROW
BEGIN
DELETE FROM file_info WHERE file_id=Old.id
END$$;
delimiter ;
j'avais essayé de mettre ";" avant $$ mais pas comme ça effectivement, "ça passe" pas d'erreur en revanche impossible avec un
de voir le bout de son nez !
__________________
Memento Quia Pulvis Es, Et In Pulverem ReverteriS
Pymento est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 14h22   #5
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 848
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 848
Points : 1 325
Points : 1 325
pense que ce que tu mets dans un trigger, une procédure ou une fonction stockée c'est du code sql donc on finit proprement la ligne avec un ;

d'où l'utilisation de delimiter pour changer la fin de ligne pour le create et bien avoir le ; dans le corps de celui-ci

tu dois préciser la base visée, la commande c'est:
Code sql :
SHOW triggers FROM nom_base;
__________________
Eric Dureuil, développeur web, c/c++, java indépendant
soyons
pensez à mettre et
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 14h30   #6
Membre confirmé
 
Avatar de Pymento
 
Homme
Ingé. Info.
Inscription : janvier 2008
Messages : 338
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 24
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingé. Info.

Informations forums :
Inscription : janvier 2008
Messages : 338
Points : 273
Points : 273
Citation:
Envoyé par ericd69 Voir le message
Code sql :
SHOW triggers FROM nom_base;
Toujours le même résultat -> Rien
__________________
Memento Quia Pulvis Es, Et In Pulverem ReverteriS
Pymento est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 14h59   #7
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 848
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 848
Points : 1 325
Points : 1 325
si tu as accès à information_schema

essaye ça:
Code sql :
1
2
SELECT trigger_schema, trigger_name, action_statement
FROM information_schema.triggers
__________________
Eric Dureuil, développeur web, c/c++, java indépendant
soyons
pensez à mettre et
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 15h05   #8
Membre confirmé
 
Avatar de Pymento
 
Homme
Ingé. Info.
Inscription : janvier 2008
Messages : 338
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 24
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingé. Info.

Informations forums :
Inscription : janvier 2008
Messages : 338
Points : 273
Points : 273
Ok, je vais dans Triggers et j'obtiens ça :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
TRIGGER_CATALOG 
TRIGGER_SCHEMA 
TRIGGER_NAME 
EVENT_MANIPULATION 
EVENT_OBJECT_CATALOG 
EVENT_OBJECT_SCHEM
EVENT_OBJECT_TABLE 
ACTION_ORDER 
ACTION_CONDITION
ACTION_STATEMENT 
ACTION_ORIENTATION 
ACTION_TIMING 
ACTION_REFERENCE_OLD_TABLE 
ACTION_REFERENCE_NEW_TABLE 
ACTION_REFERENCE_OLD_ROW 	
ACTION_REFERENCE_NEW_ROW 
CREATED 
SQL_MODE 	
DEFINER 
CHARACTER_SET_CLIENT 
COLLATION_CONNECTION 
DATABASE_COLLATION
Les champs donc, et aucune entrée.
Donc je n'ai pas de trigger enregistré.
Le problème viendrait donc de la création elle même ?

sachant que en executant le dernier bloc sql du post ça me donne :
Code :
Votre requête SQL a été exécutée avec succès
__________________
Memento Quia Pulvis Es, Et In Pulverem ReverteriS
Pymento est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 15h55   #9
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 848
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 848
Points : 1 325
Points : 1 325
trigger_schema c'est le nom de ta base et trigger name le nom du trigger...

au fait tu as bien un use avant ta création de trigger pour dire dans quelle base tu es?
__________________
Eric Dureuil, développeur web, c/c++, java indépendant
soyons
pensez à mettre et
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 16h04   #10
Membre confirmé
 
Avatar de Pymento
 
Homme
Ingé. Info.
Inscription : janvier 2008
Messages : 338
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 24
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingé. Info.

Informations forums :
Inscription : janvier 2008
Messages : 338
Points : 273
Points : 273
Citation:
trigger_schema c'est le nom de ta base et trigger name le nom du trigger...
Ouai c'est tout nouveau pour moi, j'ai mis ça direct, mais ça me l'a pris comme un SELECT *


Citation:
au fait tu as bien un use avant ta création de trigger pour dire dans quelle base tu es?
Non je viens de le rajouter mais ça change rien, de toute façon il sait dans quelle base je suis non ? (en étant sur phpMyAdmin et sur la section SQL à l'intérieur de ma base)
__________________
Memento Quia Pulvis Es, Et In Pulverem ReverteriS
Pymento est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 16h17   #11
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 848
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 848
Points : 1 325
Points : 1 325
oui normalement si tu as sélectionné une db dans la liste avant...

ça devrait pas être un before delete ton événement pour pouvoir accéder à old dans le trigger?
__________________
Eric Dureuil, développeur web, c/c++, java indépendant
soyons
pensez à mettre et
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 16h24   #12
Membre confirmé
 
Avatar de Pymento
 
Homme
Ingé. Info.
Inscription : janvier 2008
Messages : 338
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 24
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingé. Info.

Informations forums :
Inscription : janvier 2008
Messages : 338
Points : 273
Points : 273
Concrètement ça devrait pas poser de pb au moins pour la création non ? mais j'ai quand même essayé avec le before, toujours pareil... je commence à désespérer
__________________
Memento Quia Pulvis Es, Et In Pulverem ReverteriS
Pymento est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 16h31   #13
Membre confirmé
 
Avatar de Pymento
 
Homme
Ingé. Info.
Inscription : janvier 2008
Messages : 338
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 24
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingé. Info.

Informations forums :
Inscription : janvier 2008
Messages : 338
Points : 273
Points : 273
Je viens même d'essayer de faire le triggers uniquement sur ma propre table, pour exclure un éventuel problème entre innodb et myIsam.

->Toujours pas
__________________
Memento Quia Pulvis Es, Et In Pulverem ReverteriS
Pymento est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 16h35   #14
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 848
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 848
Points : 1 325
Points : 1 325
j'ai relu la doc...

pour l'instant tu ne peux pas faire référence directement à une table dedans

tu ne peux utiliser que old ou new

je pense que tu vas devoir opter pour une procédure stockée qui feras ton delete principal et ensuite le répercutera sur la table secondaire...

Citation:
Le déclencheur ne peut pas faire référence directe aux tables par leur nom, y copmris la table à laquelle il est associé. Par contre, vous pouvez utiliser les mots clés OLD (ancien en anglais) et NEW (nouveau en anglais). OLD fait référence à la ligne existante avant la modification ou l'effacement. NEW faire référence à la nouvelle ligne insérée ou à la ligne modifiée.
__________________
Eric Dureuil, développeur web, c/c++, java indépendant
soyons
pensez à mettre et
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 16h48   #15
Membre confirmé
 
Avatar de Pymento
 
Homme
Ingé. Info.
Inscription : janvier 2008
Messages : 338
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 24
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingé. Info.

Informations forums :
Inscription : janvier 2008
Messages : 338
Points : 273
Points : 273
Houla, ça change complètement ma conception du trigger.... j'ai un soucis pour les procédures stockées par contre...
En gros j'ai des "delete on cascade" et pas mal de profondeur du coup avec une procédure stockée je sais pas si je vais pouvoir faire grand chose non ?
Sachant que je sais justement pas quelles lignes seront effacées... :/
__________________
Memento Quia Pulvis Es, Et In Pulverem ReverteriS
Pymento est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 17h01   #16
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 848
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 848
Points : 1 325
Points : 1 325
si tu peux avoir 255 niveau de récursion

oui ils ont implémenté les trigger minimalistes lol... j'avoue que j'en ai pas utilisé depuis 2006 quand je tripatouillais oracle 9i ...

donc des triggers un peu évolués

si tes données sont réparties juste dans des tables dépendantes sans parcours récursif sur elles tu mais juste tes delete les uns derrière les autres... tout simple

sinon tu crées autant de procédures stockées qui traitent la récursion sur une table particulière (vu que tu peux pas faire de requête préparée qui risqueraient de s'auto appeler)

__________________
Eric Dureuil, développeur web, c/c++, java indépendant
soyons
pensez à mettre et
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 17h17   #17
Membre confirmé
 
Avatar de Pymento
 
Homme
Ingé. Info.
Inscription : janvier 2008
Messages : 338
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 24
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingé. Info.

Informations forums :
Inscription : janvier 2008
Messages : 338
Points : 273
Points : 273
EUREKÂ


Code :
1
2
3
4
5
6
7
8
9
10
 
 
DELIMITER $$
CREATE TRIGGER delete_cascade_element
AFTER DELETE ON elements
FOR EACH ROW
BEGIN
DELETE FROM file_info WHERE file_id=Old.id;
END$$
DELIMITER ;
ça s'enregistre bien comme ça !
__________________
Memento Quia Pulvis Es, Et In Pulverem ReverteriS
Pymento est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 17h28   #18
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 848
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 848
Points : 1 325
Points : 1 325
ah oui le for each row pour dire que tu veux que ça s'applique à toutes les ligne c'est vrai lol

mais est ce qu'il marche?
__________________
Eric Dureuil, développeur web, c/c++, java indépendant
soyons
pensez à mettre et
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 17h30   #19
Membre confirmé
 
Avatar de Pymento
 
Homme
Ingé. Info.
Inscription : janvier 2008
Messages : 338
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 24
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingé. Info.

Informations forums :
Inscription : janvier 2008
Messages : 338
Points : 273
Points : 273
Non c'était juste la partie ";" & "delimiter" mal placé enfait (à la fin de la requête).

alors si il marche, ça, j'ai pas testé, je ferai ça demain matin ! je te tiens au jus !
__________________
Memento Quia Pulvis Es, Et In Pulverem ReverteriS
Pymento est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2011, 17h47   #20
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 848
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 848
Points : 1 325
Points : 1 325
ok sinon procédure stockée :p
__________________
Eric Dureuil, développeur web, c/c++, java indépendant
soyons
pensez à mettre et
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h35.


 
 
 
 
Partenaires

Hébergement Web