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 :

Créer un trigger sur delete d'une seule ligne


Sujet :

SQL Procédural MySQL

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2018
    Messages : 19
    Par défaut Créer un trigger sur delete d'une seule ligne
    Bonjour à tous ,

    J'ai un petit souci en mysql et je voudrais savoir si on peut créer un trigger qui va protéger le delete ou l'update d'une donnée bien précise.

    En fête j'ai une table tarif , et dans cette table j'ai un tarif par défaut que je que personne ne puisse l'effacer.

    J'aimerais savoir si on peut bloquer ça en faisant un trigger ou qq chose genre : " if ( delete from tarifs where id="id du tarif par defaut " ) then :" block "

    Je l'ai fait du côté client mais j'aimerais le faire en db aussi.

    J’espère que j'ai été plus ou moins clair

    Merci d'avance pour votre réponse

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 997
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 997
    Billets dans le blog
    6
    Par défaut
    Cela dépend avec quelle version de PG.

    La toute dernière permettant enfin de gérer les transactions dans les routines (cela existe depuis 20 ans dans les autres SGBDR) vous pouvez appliquer un simple ROLLBACK

    Sinon, il faut générer une exception.

    Excusez moi, je me croyais dans le forum PG.... et pas dans MYSQL !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 877
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 877
    Par défaut
    Salut à tous.

    Dans mon exemple, la ligne id=3 ne doit pas subir de modification ou être supprimée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    --------------
    SET AUTOCOMMIT = 0
    --------------
     
    --------------
    START TRANSACTION
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE `base`
        DEFAULT CHARACTER SET `latin1`
        DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `test`
    --------------
     
    --------------
    CREATE TABLE `test`
    (  `id`   integer unsigned  not null auto_increment primary key,
       `lib`  varchar(255)      not null
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    DROP TRIGGER IF EXISTS `verify_1`
    --------------
     
    --------------
    CREATE TRIGGER `verify_1`
    BEFORE DELETE ON `test`
    FOR EACH ROW
    BEGIN
      DECLARE _msg  varchar(255);
     
      IF (old.id = 3) then
         set _msg = concat('ID=3, suppression interdite !');
         SIGNAL SQLSTATE VALUE '07777' SET MESSAGE_TEXT = _msg, MYSQL_ERRNO = 7777;
      END IF;
    END
    --------------
     
    --------------
    DROP TRIGGER IF EXISTS `verify_2`
    --------------
     
    --------------
    CREATE TRIGGER `verify_2`
    BEFORE UPDATE ON `test`
    FOR EACH ROW
    BEGIN
      DECLARE _msg  varchar(255);
     
      IF (old.id = 3) then
         set _msg = concat('ID=3, modification interdite !');
         SIGNAL SQLSTATE VALUE '08888' SET MESSAGE_TEXT = _msg, MYSQL_ERRNO = 8888;
      END IF;
    END
    --------------
     
    --------------
    INSERT INTO `test` (`lib`) VALUES
      ('un'),('deux'),('trois'),('quatre'),('cinq')
    --------------
     
    --------------
    select * from `test`
    --------------
     
    +----+--------+
    | id | lib    |
    +----+--------+
    |  1 | un     |
    |  2 | deux   |
    |  3 | trois  |
    |  4 | quatre |
    |  5 | cinq   |
    +----+--------+
    --------------
    delete from `test` where id = 2
    --------------
     
    --------------
    delete from `test` where id = 3
    --------------
     
    ERROR 7777 (07777) at line 83: ID=3, suppression interdite !
    --------------
    update `test`  set lib = 'vingt-cinq' where id=1
    --------------
     
    --------------
    update `test`  set lib = 'dix mille'  where id=3
    --------------
     
    ERROR 8888 (08888) at line 86: ID=3, modification interdite !
    --------------
    select * from `test`
    --------------
     
    +----+------------+
    | id | lib        |
    +----+------------+
    |  1 | vingt-cinq |
    |  3 | trois      |
    |  4 | quatre     |
    |  5 | cinq       |
    +----+------------+
    --------------
    COMMIT
    --------------
     
    --------------
    SET AUTOCOMMIT = 1
    --------------
     
    Appuyez sur une touche pour continuer...
    Le mieux serait de le faire au niveau application que de le traiter par un déclencheur.

    @+

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2018
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2018
    Messages : 19
    Par défaut
    merci beaucoup ça m'a vraiment aidé et votre site est très intéressant

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

Discussions similaires

  1. créer un trigger sur delete
    Par giova_fr dans le forum Langage SQL
    Réponses: 2
    Dernier message: 28/04/2010, 16h05
  2. Réponses: 1
    Dernier message: 15/11/2007, 21h02
  3. Plusieures infos sur une seule ligne avec ou sans tableau
    Par Him dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 17/03/2006, 14h16
  4. Synedit -commentaires sur une seule ligne
    Par Malone dans le forum Composants VCL
    Réponses: 2
    Dernier message: 03/02/2006, 19h44
  5. wxWidgets : couleur de texte sur une seule ligne
    Par Oatly dans le forum wxWidgets
    Réponses: 8
    Dernier message: 05/12/2004, 19h24

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