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

Développement SQL Server Discussion :

Trigger simple INSERT/UPDATE


Sujet :

Développement SQL Server

  1. #1
    Membre actif
    Avatar de castorcharly
    Homme Profil pro
    Chef de projet
    Inscrit en
    Février 2009
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2009
    Messages : 416
    Points : 299
    Points
    299
    Par défaut Trigger simple INSERT/UPDATE
    Bonjour,

    j'ai beau chercher dans tous les supports pour SQL 2008, je n'arrive pas à trouver une syntaxe de trigger comme celle que j'utilise pour Firebird:

    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
     
    SET TERM ^ ;
     
    /* Triggers only will work for SQL triggers */
    CREATE TRIGGER "S_CONNECTES_BI0" FOR "S_CONNECTES" 
    ACTIVE BEFORE INSERT POSITION 0
    AS
    begin
      new.dateINS = cast('NOW' as timestamp);
    end
     ^
    CREATE TRIGGER "S_CONNECTES_BU0" FOR "S_CONNECTES" 
    ACTIVE BEFORE UPDATE POSITION 0
    AS
    begin
      new.dateUP = cast('NOW' as timestamp);
    end
     ^
    COMMIT WORK ^
    SET TERM ;^
    Dans ma table S_CONNECTES j'ai deux champs, dateUP et dateIns, qui doivent être mis à jour, lors de la création pour dateINS et à chaque update dans dateUP.

    merci pour votre aide, en sachant que j'ai des millions de lignes, donc il faut que ce trigger soit peu gourmand en temps.

  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 852
    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 852
    Points : 52 992
    Points
    52 992
    Billets dans le blog
    6
    Par défaut
    Un seul trigger suffit pour les deux :

    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
    CREATE TRIGGER S_CONNECTES_BI0
    ON dbo.S_CONNECTES
    FOR INSERT, UPDATE
    AS
     
    -- mise à jour pour insertion :
    UPDATE dbo.S_CONNECTES
       SET dateINS = GETDATE()
    FROM   dbo.S_CONNECTES AS S
           INNER JOIN inserted AS i
                 ON S.??? = i.???
    WHERE  NOT EXISTS(SELECT *
                      FROM   deleted);
     
    -- mise à jour pour modif :
    UPDATE dbo.S_CONNECTES
       SET dateUP = GETDATE()
    FROM   dbo.S_CONNECTES AS S
           INNER JOIN inserted AS i
                 ON S.??? = i.???
    WHERE  EXISTS(SELECT *
                  FROM   deleted);
     
    GO
    Ou ??? représente la colonne clef de votre table dbo.S_CONNECTES.
    Les déclencheurs SQL Server sont ensemblistes. C'est pourquoi il ne faut faire que des requêtes et jamais de code itératif.

    Entre nous le cas de l'insertion est inutile et comme un trigger est beaucoup moins performant qu'une contrainte, je mettrais une valeur par défaut dans dateINS avec GETDATE().

    A +

  3. #3
    Membre actif
    Avatar de castorcharly
    Homme Profil pro
    Chef de projet
    Inscrit en
    Février 2009
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2009
    Messages : 416
    Points : 299
    Points
    299
    Par défaut
    Merci pour cette réponse avec code complet,

    mais vu ce que je lis, ça me paraît effectivement très lourd.
    Vu que j'ai de 1 millions jusqu'a 100 millions de lignes à updater,
    l'autre solution est peut être plus efficace.

    Je vais chercher à faire cette contrainte, sinon je passerais mes valeurs via les params de mes update ou insert.

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 852
    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 852
    Points : 52 992
    Points
    52 992
    Billets dans le blog
    6
    Par défaut
    Pour l'insert c'est OK, il vaut mieux passer par la contrainte.

    Pour l'update, seule les lignes réellement impactées seront mise à, jour pour la colonne dateUP du fait de la jointure avec la pseudo table inserted. Je doute que vous fassiez des UPDATE portant sur 100 millions de ligne !

    Et dans ce dernier cas on simplifie le trigger de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CREATE TRIGGER S_CONNECTES_BI0
    ON dbo.S_CONNECTES
    FOR UPDATE
    AS
     
    UPDATE dbo.S_CONNECTES
       SET dateUP = GETDATE()
    FROM   dbo.S_CONNECTES AS S
           INNER JOIN inserted AS i
                 ON S.??? = i.???
     
    GO
    A +

  5. #5
    Membre actif
    Avatar de castorcharly
    Homme Profil pro
    Chef de projet
    Inscrit en
    Février 2009
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2009
    Messages : 416
    Points : 299
    Points
    299
    Par défaut
    SqlPro,

    merci pour ces précisions,

    Pour les updates, le nombre peut atteindre les 3..4 millions de lignes.
    Ce n'est pas annodin.

    Mon souhait de passer via des triggers, vient de mon expérience de FB qui ne fonctionne pas de manière identique à MS SQL.
    Aucun jugement, juste un fait et donc un reflexe pour faire un code et des procs les plus concises possibles aussi bien dans mon exe que dans les SQL.

    Je passe 4 params à mes inserts ou updates, j'en passerai un de plus selon la méthode.

    Mais encore merci pour l'attention que vous portez aux questions des novices MSSQL.

    Juste une question subsidiaire, que signifie
    "Les déclencheurs SQL Server sont ensemblistes" ?

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 852
    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 852
    Points : 52 992
    Points
    52 992
    Billets dans le blog
    6
    Par défaut
    Ils ne traitent pas les données ligne par ligne, mais par requête uniquement. Si vous mettez à jour 1 millions de ligne, ceci ne va déclencher le déclencheur qu'une seule fois, quelque soit le nombre de lignes.

    A +

  7. #7
    Membre actif
    Avatar de castorcharly
    Homme Profil pro
    Chef de projet
    Inscrit en
    Février 2009
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2009
    Messages : 416
    Points : 299
    Points
    299
    Par défaut
    Ok, je comprends ce que cela implique.

    Merci encore pour toutes vos réponses,

    je clos le sujet.

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

Discussions similaires

  1. TRIGGER de type "for insert,update"
    Par samworld dans le forum Développement
    Réponses: 3
    Dernier message: 04/07/2007, 19h20
  2. [SQL2005]Trigger On delete, insert, update(colonne)
    Par slim dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 27/02/2007, 16h36
  3. Trigger d'insertion et d'update
    Par Shiva dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 01/01/2007, 14h32
  4. [trigger] insert update et delete
    Par kooljy dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 13/07/2006, 08h56
  5. TRIGGER avec inserted + UPDATE sur INSERTED
    Par shaka84 dans le forum Développement
    Réponses: 3
    Dernier message: 12/04/2006, 10h26

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