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 & table "inserted"


Sujet :

Développement SQL Server

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 33
    Points : 8
    Points
    8
    Par défaut Trigger & table "inserted"
    Salut,

    Je début en SQL server. Venant du monde Oracle, j'ai quelques difficultés.
    J'essaie de définir un trigger qui pour chaque nouvelle inséré dans une table vérifie la validité de cette ligne. Or, j'ai beaucoup de mal à isoler une ligne distinctement par toutes celles contenues dans la table "inserted" (qui, si j'ai bien compris, peu contenir toutes lignes insérées).

    Sous Oracle, il existe une pseudo-variable "new" qui contient les valeurs de chaque colonne de la nouvelle ligne.

    Merci d'avance,
    @+, Alex

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 150
    Points : 65
    Points
    65
    Par défaut
    Salut
    Pour isoler une ligne de table inserted tu peux faire un select sur cette table comme si tu effectuais un SELECT sur une table normal.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 33
    Points : 8
    Points
    8
    Par défaut
    Salut,

    Certes, j'entends bien ! Mais mon gros soucis, c'est que cette table contient toutes les lignes insérées et qu'un trigger "after insert" va se déclencher de manière global pour toutes les nouvelles insertions d'une table et non pas pour chaque ligne nouvellement insérée.

    Mais peut-être y a t-il une martingale que, moi yen a être grand débutant avec SQL Server, je ne connais pas ...

    Merci de ton aide,
    @+, Alex

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 74
    Points : 84
    Points
    84
    Par défaut
    Salut,

    ben je pense qu'en creant un curseur dans ton trigger tu pourras accéder à chaque ligne et chaque colonne.. du genre :



    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
     
     
    DECLARE IDCursor CURSOR LOCAL 
          READ_ONLY   FOR 
             SELECT [col1], ..., [colN] FROM Inserted 
     
          DECLARE @col1 [typecol1], 
           ....  
          @colN [typecolN]
     
          OPEN IDcursor 
     
          FETCH NEXT FROM IDCursor INTO @col1, ....,@colN 
     
          WHILE (@@fetch_status <> -1) 
          BEGIN 
     
          IF (@@fetch_status <> -2) 
             BEGIN 
     
                /* mon traitement , mes test sur @col1 ... @colN..*/
     
             END 
     
             -- next row 
     
            FETCH NEXT FROM IDCursor INTO @col1, ....,@colN 
     
     
          END
    Bon je sais les curseurs c'est pas très classe ..mais bon..
    J'espère que ca pourra t'aider...
    a+

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 33
    Points : 8
    Points
    8
    Par défaut
    Salut,

    Merci pour la combine. En fait, j'y avais vaguement pensé, mais je pensais qu'il existait un autre moyen.

    Merci,
    @+, Alex

    Ah, au fait, pourquoi c'est pas classe les curseurs ? ?

  6. #6
    Rédacteur/Modérateur

    Avatar de Fabien Celaia
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2002
    Messages
    4 222
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 4 222
    Points : 19 551
    Points
    19 551
    Billets dans le blog
    25
    Par défaut
    Citation Envoyé par alexvdb
    Ah, au fait, pourquoi c'est pas classe les curseurs ? ?
    Déjà à la base, le SQL est un language ensembliste. Le curseur est séquentiel.

    Il n'est pas performant, il bouffe de la mémoire, il est lent et maintient donc plus longtemps qu'à l'envi des verrous...
    Sr DBA Oracle / MS-SQL / MySQL / Postgresql / SAP-Sybase / Informix / DB2

    N'oublie pas de consulter mes articles, mon blog, les cours et les FAQ SGBD

    Attention : pas de réponse technique par MP : pensez aux autres, passez par les forums !

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 33
    Points : 8
    Points
    8
    Par défaut
    Salut,

    OK, donc pour mon problème, sous oracle (puisque je viens de cette contrée ...) j'aurai résolu ca par un trigger sur la table, puisque les trigges oracle se déclenchent à la ligne. Par contre, sous SQL Server, au lieu d'utiliser un trigger et d'utiliser un curseur (pas classe, et j'aime pas faire des choses pas classe), peut-être devrai-je transférer ma règle de vérification dans la procédure qui va me servir à l'insertion ?

    Nan, hein ?

    @+, Alex

  8. #8
    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
    Pourquoi pas ?
    Mais vous devez seulement garder à l'esprit que vous devez toujours appeler cette SP dans toutes les procédures d'insertion dans cette table ce qui n'est pas très sure.
    Pour ma part, j'aurai perdu un peu en rapidité mais gagné en contrôle d'intégrité des données, car le trigger est l'object le plus sure pour définir les contraintes complexes.
    La priorité est qu'il faut d'abord faire tourner sans erreur et par la suite penser à l'optimisation.
    L'on n'optimise pas ce qui ne marche pas !

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

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 33
    Points : 8
    Points
    8
    Par défaut
    Salut,

    Tout à fait d'accord sur ce point de vue. Je vais donc faire ce trigger et je verai par la suite.

    Merci pour tout,
    @+ et bonne fête de fin d'année, Alex

  10. #10
    Membre habitué
    Inscrit en
    Mars 2004
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 126
    Points : 151
    Points
    151
    Par défaut
    salut.
    Tu peux aussi transformer le curseur comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    DECLARE @t TABLE( Cptr Identity(1,1) , col_1,...col_n )
    INSERT @t( col_1,...col_n ) SELECT col_1,...col_n FROM INSERTED
     
    DECLARE @i Int
    WHILE Exists( SELECT * FROM @t ) BEGIN
      SELECT TOP 1 @i  = Cptr FROM @t
      DELETE @t Where Cptr = @i
      -----------
      La suite de ton traitement
    END
    Voir également SQL PRO

  11. #11
    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
    Citation Envoyé par inoussa
    salut.
    Tu peux aussi transformer le curseur comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    DECLARE @t TABLE( Cptr Identity(1,1) , col_1,...col_n )
    INSERT @t( col_1,...col_n ) SELECT col_1,...col_n FROM INSERTED
     
    DECLARE @i Int
    WHILE Exists( SELECT * FROM @t ) BEGIN
      SELECT TOP 1 @i  = Cptr FROM @t
      DELETE @t Where Cptr = @i
      -----------
      La suite de ton traitement
    END

    Voir également SQL PRO
    Sous quelle version de MS SQL Serveur ?
    Un lien vers le document ferait l'affaire !

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

  12. #12
    Membre habitué
    Inscrit en
    Mars 2004
    Messages
    126
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 126
    Points : 151
    Points
    151
    Par défaut
    -Version : MS SQL SERVER 2000 et Sup
    -Voir le site SLQ PRO pour des astuces d'optimisation.

Discussions similaires

  1. Trigger sur table en INSERT
    Par salsamania dans le forum Développement
    Réponses: 7
    Dernier message: 28/09/2010, 16h27
  2. [ACCESS][JAVA][INSERT][QUOTE]Pb insertion quot
    Par 205 dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 31/01/2008, 17h00

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