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 et Update SQL2000 versus SQL 2008 R2


Sujet :

Développement SQL Server

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 23
    Par défaut Trigger et Update SQL2000 versus SQL 2008 R2
    Bonjour,

    Nous avons migré un projet .adp tournant avec SQL 2000 vers SQL 2008 R2 en août dernier.
    Tout c’est bien passé au début mais depuis quelques temps nous avons des soucis avec des UPDATE dans des trigger.
    Avant UPDATE dbo.table SET Toto=’x’ passait sans problème même s’il y avait plusieurs enregistrements de Toto.
    Aujourd’hui il faut sélectionner successivement chaque enregistrement pour pouvoir le mettre à jour : UPDATE dbo.table SET Toto=’x’ WHERE ClefToto=1
    Quelqu’un aurait-il une idée de ce qui a pu provoquer cela alors que nous n’avons rien changé à la base SQL depuis notre migration ? D’autre part, pour faire cela, j’utilise souvent le type de procédure que je mets en exemple ci-après.
    Je charge la clef des enregistrements à mettre à jour dans une table temporaire. Alors que le délai d’expiration des requêtes est fixé à 10 min je me retrouve avec « expiration du délai » bien avant les 10 minutes. De plus dans l’exemple ci-après la table contient environ 35000 enregistrements et bien avant les 10 min j’ai droit au message « délai expiré » ce qui m’oblige à découper le nombre d’enregistrements à traiter avec between.
    Si quelqu’un avait une requête plus rapide et performante je suis preneur….
    Merci.
    Bonne journée

    JPaul

    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
    ALTER PROCEDURE zzzavirertrace
    AS
    DECLARE @tab table(tId_Trace int, tagi bit default(0))
    SET NOCOUNT ON
    INSERT into @tab(tId_Trace)
    SELECT  Id_Trace from dbo.T_Trace where Type_Trace is null and Id_Trace between 80000 and  90000
    order by  Id_Trace
    while exists(select top 1 tId_Trace  from @tab where tagi=0)
    begin
    delete dbo.t_trace where  Id_Trace=(select top 1 tId_Trace  from @tab where tagi=0)
    update @tab
    set tagi=1
    where tid_trace=(select top 1 tId_Trace  from @tab where tagi=0) AND tagi=0
    end 
    RETURN

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Bonjour,

    Citation Envoyé par JPaul94300 Voir le message
    Avant UPDATE dbo.table SET Toto=’x’ passait sans problème même s’il y avait plusieurs enregistrements de Toto.
    Aujourd’hui il faut sélectionner successivement chaque enregistrement pour pouvoir le mettre à jour
    Avez vous une erreur ? postez la !

    globalement, il y a plusieurs choses qui ne vont pas dans votre procédure comme par exemple :

    1/ votre ORDER BY n'a aucun sens, puisqu'il est dans une requete d'insertion, et qu'une table n'a pas d'ordre.
    2/ en revanche, le ORDER BY manque dans votre requetes TOP 1 dans votre boucle. Sans cela, rien ne vous garanti que les deux requetes identiques successivent vous retourneront le même résultat.

    Enfin et surtout, pourquoi passez vous par un boucle ?, pourquoi ne pas tout supprimer de la table t_trace en une seule requeête ? combien de lignes sont visées par la suppression ?

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 990
    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 990
    Billets dans le blog
    6
    Par défaut
    Effectivement votre code est bugué dans le sens ou il fait un ORDER BY illicite.
    Si ceci était toléré dans SQL Server 2000 et jusqu'à SQL Server 2005 (pas toujours) cela est proscrit depuis la version 2008. Néanmoins par soucis de rétro compataibilité la clause ORDER BY peut être mise avec le TOP, mais n'est désormais plus jamais prise en compte dans :
    • les sous requêtes
    • les vues
    • les fonctions table


    Pour vous en convaincre, tentez cette chose dans les 3 moteurs (2000, 2005, 2008) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    CREATE TABLE T (C INT IDENTITY PRIMARY KEY, D VARCHAR(32))
    GO
     
    INSERT INTO T VALUES ('Q'), ('Z'), ('M'), ('A');
    GO
     
    CREATE VIEW V AS
    SELECT TOP 100 PERCENT WITH TIES *
    FROM   T
    ORDER  BY D:;
    GO
     
    SELECT * FROM V;
    Et constatez la différence !

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

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 23
    Par défaut Trigger et Update
    Merci de vos réponses,

    en fait c'est plus à la première partie de ma question que j'aimerai avoir un avis plutôt qu'à la syntaxe de la procédure mise en exemple : quelles sont les causes possibles qui m'oblige dorénavant à faire un update en sélectionnant successivement les enregistrements à mettre à jour ?


    Si quelqu'un à une idée.

    Merci

    Bonne journée

Discussions similaires

  1. Réponses: 4
    Dernier message: 05/04/2011, 08h32
  2. pb avec requête UPDATE sous SQL 2008
    Par tibofo dans le forum Développement
    Réponses: 6
    Dernier message: 22/01/2011, 21h20
  3. Réponses: 2
    Dernier message: 11/06/2010, 14h35
  4. Trigger FOR UPDATE sur SQL Server
    Par fouad_r dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 05/06/2009, 15h43

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