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

MS SQL Server Discussion :

Comprendre la syntaxe des triggers


Sujet :

MS SQL Server

  1. #1
    Expert éminent
    Avatar de berceker united
    Profil pro
    SQL
    Inscrit en
    Février 2005
    Messages
    3 488
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SQL
    Secteur : Finance

    Informations forums :
    Inscription : Février 2005
    Messages : 3 488
    Points : 6 037
    Points
    6 037
    Par défaut Comprendre la syntaxe des triggers
    Bonjour.
    Je suis toujours dans la découverte du T-SQL et j'ai une question qui pourrait m'ouvrir beaucoup de porte par la suite. Alors je ne demande pas d'avoir du code tout cuit dans le bec mon objectif premier est de comprendre comment fonctionne ces mécanismes.
    J'ai un cas. J'ai quelques tables avec le champs date_crea et date_modif et je ne voudrais pas le gérer via un language parce que tous le monde aura compris que date_crea c'est la date de creation de l'enregistrement et date_modif c'est lorsqu'il y a eu une modification sur l'enregistrement. J'ai donc pensé à utiliser des triggers. Mais j'ai un trou et je ne sais pas comment savoir sur quel enregistrement je me trouve.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE TRIGGER NewDate
    ON ma_table
       AFTER INSERT
    AS
    ...
    Ben voila je seche :/ je sais pas comment dire qu'après l'enregistrement il faut mettre la date actuelle sur cette enregistrement sur le champs date_crea.
    Quel est la syntaxe ? Ainsi je pourrais faire la même chose pour la modification de l'enregistrement.
    Merci
    Mon avatar ? Ce n'est rien, c'est juste la tête que je fais lorsque je vois un code complètement frappa dingue !...

  2. #2
    SLE
    SLE est déconnecté
    Membre éclairé Avatar de SLE
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 604
    Points : 799
    Points
    799
    Par défaut
    Salut,

    Tu devrais déjà plutôt faire un BEFORE INSERT dans ce cas !

    puis dans le corps de ton trigger,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    new.date_crea = DateSys()
    (je crois que c'est DateSys() avec SqlServer, mais je suis pas un spécialiste de ce SGBDR)

  3. #3
    Expert éminent
    Avatar de berceker united
    Profil pro
    SQL
    Inscrit en
    Février 2005
    Messages
    3 488
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SQL
    Secteur : Finance

    Informations forums :
    Inscription : Février 2005
    Messages : 3 488
    Points : 6 037
    Points
    6 037
    Par défaut
    Merci.
    Il me semble que BEFOR n'existe pas sous SQL Server
    C'est GETDATE() qui me retourne la date et l'heure.
    Mon avatar ? Ce n'est rien, c'est juste la tête que je fais lorsque je vois un code complètement frappa dingue !...

  4. #4
    Expert éminent
    Avatar de berceker united
    Profil pro
    SQL
    Inscrit en
    Février 2005
    Messages
    3 488
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SQL
    Secteur : Finance

    Informations forums :
    Inscription : Février 2005
    Messages : 3 488
    Points : 6 037
    Points
    6 037
    Par défaut
    J'ai trouvé une astuce je ne sais pas si c'est elle propre mais j'ai agis par déduction mais en tous cas ça fonctionne. Il y a une technique plus propre?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    CREATE TRIGGER NewDate
    ON dbo.zorha_prd_categorie
       AFTER INSERT
    AS
    UPDATE zorha_prd_categorie SET date_crea = GETDATE(),date_modif=GETDATE() WHERE idcategorie=(SELECT @@IDENTITY)
    Mais pour la mise à jour comment savoir sur quel Id nous nous trouvons pour que je puisse faire la même chose?
    Mon avatar ? Ce n'est rien, c'est juste la tête que je fais lorsque je vois un code complètement frappa dingue !...

  5. #5
    Rédacteur
    Avatar de WOLO Laurent
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Mars 2003
    Messages
    2 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 741
    Points : 4 414
    Points
    4 414
    Par défaut
    Je confirme que les triggers BEFOR n'existe pas sous MS SQL Serveur
    Il y'a deux fonctions qui permette de retourner l'heure courante :
    GETDATE() et CURENT_TIMESTAMPS ou quelque chose comme cela, vous devez vérifier l'othographe.

    A lire : Le petit guide du T-SQL

    Découvrez la FAQ de MS SQL Server.
    La chance accorde ses faveurs aux esprits avertis !

  6. #6
    Expert éminent
    Avatar de berceker united
    Profil pro
    SQL
    Inscrit en
    Février 2005
    Messages
    3 488
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SQL
    Secteur : Finance

    Informations forums :
    Inscription : Février 2005
    Messages : 3 488
    Points : 6 037
    Points
    6 037
    Par défaut
    Merci.
    J'ai reussi avec l'insertion d'un nouvel enregistrement mais pour la modification j'ai pas vraiment trouvé, du moin j'ai trouvé une piste en utilisant la table INSERTED mais là en faisant des test je n'arrive pas à consulter cette table pourtant il est dit que cette table virtuel est consultable comme une simple table. Donc j'ai surement du zaper quelque chose qu'il fallait savoir avant de faire un simple SELECT * FROM INSERTED.

    J'ai lu le guide du T SQL mais elle ne répond pas à mes questions
    Mon avatar ? Ce n'est rien, c'est juste la tête que je fais lorsque je vois un code complètement frappa dingue !...

  7. #7
    Rédacteur
    Avatar de WOLO Laurent
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Mars 2003
    Messages
    2 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 741
    Points : 4 414
    Points
    4 414
    Par défaut
    Il est conseillé de poster le scripte qui ne fonctionne pas ?

    Découvrez la FAQ de MS SQL Server.
    La chance accorde ses faveurs aux esprits avertis !

  8. #8
    Expert éminent
    Avatar de berceker united
    Profil pro
    SQL
    Inscrit en
    Février 2005
    Messages
    3 488
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SQL
    Secteur : Finance

    Informations forums :
    Inscription : Février 2005
    Messages : 3 488
    Points : 6 037
    Points
    6 037
    Par défaut
    Justement, j'ai pas vraiment de script parce que je ne sais pas comment faire.
    J'ai ce premier script qui m'a permit d'insérer la date actuelle lorsqu'il y a un nouvelle enregistrement. Quoi que, il parait que j'aurais pu placer directement GETDATE() dans le champs "Valeur par défaut". Bref pas grave.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    CREATE TRIGGER NewDate
    ON dbo.zorha_prd_categorie
       AFTER INSERT
    AS
    UPDATE zorha_prd_categorie SET date_crea = GETDATE(),date_modif=GETDATE() WHERE idcategorie=(SELECT @@IDENTITY)
    Maintenant, je veux faire plus ou moin la même chose pour la mise à jour de l'enregistrement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    CREATE TRIGGER NewDate
    ON dbo.zorha_prd_categorie
       AFTER UPDATE
    AS
    UPDATE zorha_prd_categorie SET date_modif=GETDATE() WHERE idcategorie=*xxx
    * l'identifiant unique de l'id sur laquelle je me trouve. oui mais comment récupérer cette valeur ? table virtuel INSERTED ?
    Mon avatar ? Ce n'est rien, c'est juste la tête que je fais lorsque je vois un code complètement frappa dingue !...

  9. #9
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 763
    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 763
    Points : 52 554
    Points
    52 554
    Billets dans le blog
    5
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE TRIGGER E_I_DATE
    ON MA_TABLE
       FOR INSERT
    AS
     
    UPDATE MA_TABLE                            -- table cible de l'UPDATE (la même que celle du trigger)
    SET    MA_COLONNE_DATE = CURRENT_TIMESTAMP -- mise à jour avec dateheure du jour
    FROM   MA_TABLE T                          -- corrélation implicite de la table cible avec MA_TABLE
           INNER JOIN inserted i               -- jointure avec la pseudo table contenant les lignes impactées
                 ON T.MaClef = i.MaClef        -- prédicat de jointure
    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/ * * * * *

  10. #10
    Expert éminent
    Avatar de berceker united
    Profil pro
    SQL
    Inscrit en
    Février 2005
    Messages
    3 488
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SQL
    Secteur : Finance

    Informations forums :
    Inscription : Février 2005
    Messages : 3 488
    Points : 6 037
    Points
    6 037
    Par défaut
    Merci. C'est le petit détail qui me manquait pour continuer
    Mon avatar ? Ce n'est rien, c'est juste la tête que je fais lorsque je vois un code complètement frappa dingue !...

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

Discussions similaires

  1. utilisation des triggers
    Par bouleboule dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 04/07/2005, 17h47
  2. [langage] comprendre une syntaxe particulière
    Par mat21 dans le forum Langage
    Réponses: 4
    Dernier message: 08/12/2004, 18h12
  3. vive la syntaxe des languages !
    Par D@rKness74 dans le forum Windows
    Réponses: 2
    Dernier message: 15/09/2004, 13h56
  4. Delphi5 (IBX) - Interbase6.0 + Utilisation des triggers
    Par _Marsu_ dans le forum Bases de données
    Réponses: 3
    Dernier message: 04/04/2004, 18h02
  5. Qry Liste des trigger
    Par Gandalf24 dans le forum Développement
    Réponses: 6
    Dernier message: 31/03/2004, 16h38

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