IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Procédural MySQL Discussion :

Triggers & Transactions [MySQL-5.6]


Sujet :

SQL Procédural MySQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 13
    Points : 11
    Points
    11
    Par défaut Triggers & Transactions
    Bonjour!

    J'aimerais qu'un trigger se déclenche sur une table, lors de la suppression de lignes... Ce trigger va supprimer des lignes dans une autre table!

    C'est l'implémentation classique d'une clause ON DELETE CASCADE dans MySQL, quand on a besoin de déclencher des triggers! Puisque la clause ON DELETE ne déclenche toujours pas les triggers...

    Prenons un exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE TABLE User (
    id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT
    );
     
    CREATE TABLE Truc (
    id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    user INT UNSIGNED,
    CONSTRAINT fkUser FOREIGN KEY (user) REFERENCES User(id) ON UPDATE CASCADE ON DELETE CASCADE
    );
    J'ai un trigger before delete sur User qui va supprimer ses Trucs.
    Dans le cas où, finalement, le User ne pourrait être supprimé, il me faut effectuer la suppression des Trucs dans une transaction.
    J'ai donc un START TRANSACTION avant la suppression des Trucs du User...
    J'imagine donc qu'il me faut créer un trigger after delete pour y placer un COMMIT!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE TRIGGER User_BeforeDelete BEFORE DELETE ON User FOR EACH ROW
    BEGIN
    START TRANSACTION;
    DELETE FROM Truc WHERE id IN (SELECT id FROM Truc WHERE user = OLD.id);
    END
     
    CREATE TRIGGER User_AfterDelete AFTER DELETE ON User FOR EACH ROW
    BEGIN
    COMMIT;
    END
    Ma question est la suivante : où dois-je placer le ROLLBACK, dans le cas où ça foire?

    Merci à vous!

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Bonjour,

    Concernant la requête dans le trigger before, pourquoi faire une sous-requête ? Elle est inutile.

    Pourquoi faites-vous un start transaction dans ce trigger ?

    La transaction est gérée par le programme appelant la requête qui va supprimer l'utilisateur.


    Concernant votre 2eme question, perso je n'ai pas compris.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 13
    Points : 11
    Points
    11
    Par défaut
    Ah oui, c'est pas faux! La sous-requête est effectivement inutile!
    Mais bon, c'est pas le problème!
    J'ai besoin d'un START TRANSACTION; avant de supprimer les Trucs, afin, comme je l'ai expliqué, que les Trucs ne soient pas supprimés si le User ne peut l'être!
    Donc, je crois bien qu'il me faut un trigger AFTER DELETE pour COMMIT; la transaction!
    Par contre, si le User n'a pas pu être supprimé, est-ce nécessaire et y a-t-il moyen de ROLLBACK?

    Je précise que c'est un exemple! En réalité, ça ne concerne pas des Users et des Trucs! Il faut donc imaginer que les Users sont rattachés à d'autres tables qui peuvent limiter les possibilités de suppression... Et puisque j'ai des triggers sur la table Truc, je ne peux pas compter sur ON DELETE CASCADE! Et je ne peux pas supprimer les Trucs dans AFTER DELETE ON User à cause de la clé étrangère! Je dois donc supprimer les Trucs avant de supprimer le User puis COMMIT; si le User a bien été supprimé ou ROLLBACK si le User ne peut être supprimé..!

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    si l'utilisateur ne peut être supprimé, la transaction qui a lancé le delete va rollbacker tout.

    Ceci inclut les requêtes dans le trigger before delete.

    De toute manière MYSql interdit l'utilisation de telles instructions :
    The trigger cannot use statements that explicitly or implicitly begin or end a transaction, such as START TRANSACTION, COMMIT, or ROLLBACK.
    https://dev.mysql.com/doc/refman/5.0...er-syntax.html

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 13
    Points : 11
    Points
    11
    Par défaut
    Erff... La réponse était dans la doc, alors -_-
    Honte sur moi!

    Merci beaucoup ^^'

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [2008R2] Trigger et transactions
    Par Donpi dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 03/10/2014, 10h06
  2. Syntaxe Trigger Mysql / Transact SQL de SQL Server
    Par Flashball dans le forum SQL Procédural
    Réponses: 8
    Dernier message: 13/03/2008, 15h23
  3. [PL/SQL] Creation de triggers dans transaction
    Par globeriding dans le forum Oracle
    Réponses: 15
    Dernier message: 07/02/2006, 11h33
  4. petite aide sur les transactions et triggers SVP
    Par CharleLéo dans le forum Débuter
    Réponses: 4
    Dernier message: 15/11/2004, 20h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo