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

Langage SQL Discussion :

Mise au point de trigger (SQL92)


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 5
    Par défaut Mise au point de trigger (SQL92)
    salut,

    j'utilise FRONTBASE(slq92) sous OSX et je désire copier l'enregistrement d'une table T_CLIENT
    vers T_CLIENT_HISTO avant sa modification.
    la syntaxe suivante à pour effet de copier l'intégralité des enregistrements
    j'en convient, mais ceci m'a permis de valider le fonctionnement du trigger.
    alors comment puis-je faire pour ne copier que l'enregistrement en cours de
    modification...autrement dit "insert into T_CLIENT_HISTO select T_CLIENT.* from T_CLIENT WHERE ID_CLIENT = ??? "

    syntaxe testé !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE  TRIGGER trig_client
        BEFORE UPDATE ON T_CLIENT FOR EACH ROW 
    BEGIN
    insert into T_CLIENT_HISTO  select T_CLIENT.* from T_CLIENT  WHERE ID_CLIENT = ID_CLIENT; 
    END
    j'espère que j'ai été assez clair dans ma requête!


    merci à tous

  2. #2
    Membre très actif Avatar de TryExceptEnd
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    501
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 501
    Par défaut
    Je ne sais pas si c'est dans une norme SQL, mais dans un trigger, tu as accès aux nouvelles valeurs des colonnes de ta table par : NEW.nom_colonne et les anciennes valeurs par : OLD.nom_colonne.
    Il faut se documenter par rapport a FRONTBASE (que je ne connais pas).

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 5
    Par défaut Mise au point de trigger (SQL92)
    merci, pour la réponse, TryExeptEnd

    à noté que Frontbase est basé sur du sql92

    j'ai testé des syntaxe utilisant: old.nom-champ et new.nom-champ tel que:
    *
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    CREATE  TRIGGER trig_client
    	BEFORE UPDATE ON T_CLIENT FOR EACH ROW 
    BEGIN
    insert into T_CLIENT_HISTO  select T_CLIENT.* from T_CLIENT  WHERE ID_CLIENT = :old.ID_CLIENT; 
    END
    *

    resultat, la creation du trigger échou , que ce soit avec ":old." ou "old."
    d'ailleur, il me semblais que ":old." était propre à Oracle !

    il faudrait contourné le problème en récupérant la valeur de l'index de l'enregistrement en cour de modification et faire quelque chose comme :
    *
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    CREATE  TRIGGER trig_client
    	BEFORE UPDATE ON T_CLIENT FOR EACH ROW 
    BEGIN
    insert into T_CLIENT_HISTO  select T_CLIENT.* from T_CLIENT  WHERE index = valeur-index; 
    END
    *

    help,help

  4. #4
    Membre très actif Avatar de TryExceptEnd
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    501
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 501
    Par défaut
    Essai la syntaxe : et fait un tour su le site de FRONTBASE.

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

    Informations forums :
    Inscription : Mars 2008
    Messages : 5
    Par défaut Mise au point de trigger (SQL92)
    OLD ou NEW seul ne passe pas non plus...je vais voir à nouveau sur le site de frontbase.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 5
    Par défaut Mise au point de trigger (SQL92)
    Salut à tous ,

    pour info, les docs frontbase font tous référence à SQL92,
    quelqu'un aurait il un lien pour une doc détaillé de SQL92,pour y voir
    la syntaxe d'un trigger de mon type !

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 002
    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 : 22 002
    Billets dans le blog
    6
    Par défaut
    Extrait de mon livre "SQL" collection Synthex :

    La syntaxe de création d'un déclencheur est la suivante :
    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
    CREATE TRIGGER <nom_trigger>
       { BEFORE | AFTER }
       { INSERT | UPDATE [ OF <liste_colonne> ] | DELETE }
    ON <nom_table> [ REFERENCING <liste_alias_valeurs_anciennes_nouvelles> ]
    [ FOR EACH { ROW | STATEMENT } ]
    [ WHEN ( <prédicat> ) ]
    BEGIN ATOMIC
    <code_SQL>
    END
     
    <liste_alias_valeurs_anciennes_nouvelles> ::=
       OLD [ ROW ] [ AS ] <nom_correlation_valeurs_anciennes>
       NEW [ ROW ] [ AS ] <nom_correlation_valeurs_nouvelles>
       OLD TABLE [ AS ] <alias_table_valeurs_anciennes>
       NEW TABLE [ AS ] <alias_table_valeurs_nouvelles>
    [...]

    exemple :
    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
    CREATE TRIGGER E_I_STANDARDISE_NOM_PRENOM
       BEFORE INSERT 
    ON T_UTILISATEUR_USR REFERENCING NEW ROW as new
    FOR EACH ROW 
    BEGIN ATOMIC
       SET new.USR_NOM = UPPER(new.USR_NOM);
       IF new.USR_PRENOM IS NOT NULL
       THEN
          SET new.USR_PRENOM = UPPER(SUBSTRING(new.USR_PRENOM FROM 1 FOR 1)
             || LOWER(SUBSTRING(new.USR_PRENOM FROM 2
                                FOR CHARACTER_LENGTH(new.USR_PRENOM) - 1);
    END
     
    CREATE TRIGGER E_U_STANDARDISE_NOM_PRENOM
       BEFORE UPDATE OF (USR_NOM, USR_PRENOM)
    ON T_UTILISATEUR_USR REFERENCING NEW ROW as new
    FOR EACH ROW 
    BEGIN ATOMIC
       SET new.USR_NOM = UPPER(new.USR_NOM);
       IF new.USR_PRENOM IS NOT NULL
       THEN
          SET new.USR_PRENOM = UPPER(SUBSTRING(new.USR_PRENOM FROM 1 FOR 1)
             || LOWER(SUBSTRING(new.USR_PRENOM FROM 2
                                FOR CHARACTER_LENGTH(new.USR_PRENOM) - 1);
    END
    Ces deux triggers standardisent la forme des données nom et prénom des utilisateurs dans le cas d'insertion ou de modification. Notez l'emploi du nom de corrélation de ligne et dans le cas du trigger UPDATE la restriction qui concerne uniquement les colonnes à reformater
    le livre : http://sqlpro.developpez.com/booksql05/


    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/ * * * * *

  8. #8
    Membre très actif Avatar de TryExceptEnd
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    501
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 501
    Par défaut
    Citation Envoyé par MIKEPRO3 Voir le message
    Salut à tous ,

    pour info, les docs frontbase font tous référence à SQL92,
    quelqu'un aurait il un lien pour une doc détaillé de SQL92,pour y voir
    la syntaxe d'un trigger de mon type !
    Si tu as bien cherché sur le site de FrontBase, tu aurais pu trouver la solution :
    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
    CREATE TRIGGER <trigger name>
    <trigger action time> <trigger event>
    ON <table name> [ ORDER <int expr> ]
    [ REFERENCING <old or new values alias list> ]
    <triggered action>
    <trigger action time> ::= BEFORE | AFTER
    <trigger event> ::=
    INSERT | DELETE | UPDATE [ OF <trigger column list> ]
    <triggered action> ::=
    [ FOR EACH {ROW | STATEMENT} ]
    WHEN <cond expr> ]
    BEGIN <list of statements> END
    <old or new values alias list> ::=
    {<old or new values alias>}+
    <old or new values alias> ::=
    OLD [ROW] [AS] <old values correlation name> |
    NEW [ROW] [AS] <new values correlation name>

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 5
    Par défaut Mise au point de trigger (SQL92)
    Merci beaucoup,
    j'ai eu un peu de mal à adapté la syntaxe à mon cas de figure,
    mais ça marche !!!
    note:"ATOMIC" ne passe pas !?!
    sa donne ça:

    *
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    CREATE TRIGGER trig_client
       BEFORE UPDATE 
    ON T_CLIENT REFERENCING NEW ROW as new
    FOR EACH ROW 
    BEGIN
      insert into T_CLIENT_HISTO  select T_CLIENT.* from T_CLIENT  WHERE ID_CLIENT =  new.ID_CLIENT; 
    END
    *

    @+ et merci, merci encore

  10. #10
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 002
    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 : 22 002
    Billets dans le blog
    6
    Par défaut
    Ce qui prouve qu e ton SGBDR n'est pas 100% normatif !!!!

    De plus il faut savoir que les trigger n'existent pas en SQL 92. EN effet ils ont été introduit à partir de la norme SQL:1999 !

    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/ * * * * *

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

Discussions similaires

  1. Mise au point d'un trigger logoff
    Par grome dans le forum PL/SQL
    Réponses: 6
    Dernier message: 29/05/2008, 08h58
  2. Mise au point d'un bon algo
    Par cryptorchild dans le forum Langage
    Réponses: 3
    Dernier message: 08/10/2005, 17h04
  3. Petite mise au point avec gluUnProject.
    Par fatpat94 dans le forum OpenGL
    Réponses: 1
    Dernier message: 27/07/2005, 15h40
  4. [Mise au point] dhcp
    Par Ernest dans le forum Développement
    Réponses: 5
    Dernier message: 07/10/2004, 17h56
  5. Questions de mise aux points
    Par nicoo dans le forum DirectX
    Réponses: 5
    Dernier message: 11/05/2004, 14h01

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