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 :

Exceptions dans le profiler [2012]


Sujet :

MS SQL Server

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2009
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 118
    Points : 27
    Points
    27
    Par défaut Exceptions dans le profiler
    Bonjour,

    J'ai un souci avec un de nos serveurs en production. Il est actuellement en version 11.0.3000.

    Nous avons beaucoup de soucis de deadlock sur ce serveur et lors de mes investigations, j'ai active une trace des exceptions. Et j'ai pu constater que le serveur lève beaucoup de 'syntaxe incorrecte vers le mot clef 'UPDATE'.

    Nous ne travaillons que en procédure stockées et quelques triggers.
    J'ai fait un filtre sur une des connexions qui posait ces problèmes. J'ai donc pu afficher les statements qui sont juste avant et juste après. Mais les deux procédures sont exécutées correctement. Je ne sais pas si j'ai bien affiché tous les évènements.

    Ci joint la copie d'écran de la trace...



    Comment faire pour trouver d’où vient l'erreur ???

    Merci de votre aide !

  2. #2
    Expert confirmé
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Points : 4 043
    Points
    4 043
    Par défaut
    ajoute les événements SP:StmtStarting et SP:StmtCompleted pour isoler l'instruction où se produit l'exception

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2009
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 118
    Points : 27
    Points
    27
    Par défaut
    Merci pour votre réponse,

    j'ai ajouté les classes que vous m'avez indiqué mais il me semble que mes procédures ne soient pas en cause...

    peut être une requete adhoc qui viendrait se faufiler entre ??

    [Edit]
    non j'ai ajouté les classes :
    • SQL : BatchStarting
    • SQL : BatchCompleted
    • SQL : StmtStarting
    • SQL : StmtCompleted

    Et pas de requêtes supplémentaires....
    [/Edit]



  4. #4
    Expert confirmé
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Points : 4 043
    Points
    4 043
    Par défaut
    Regarde si c'est le même SPID. Tu as aussi la colonne ClientProcessID qui te donne l'identifiant du processus client pour vérifier qu'il s'agit bien de la même application cliente.

  5. #5
    Membre éprouvé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2009
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Août 2009
    Messages : 623
    Points : 1 049
    Points
    1 049
    Par défaut
    Tu peux valider la majorité de tes procédures stockées avec cet outil (évites de le tester en prod, utilises plutôt un environnement de test).
    Si tu mets hors de cause tes procédures stockées, comme tu le dis dans ton premier message, regardes du coté des triggers.

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2009
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 118
    Points : 27
    Points
    27
    Par défaut
    Citation Envoyé par rudib Voir le message
    Regarde si c'est le même SPID. Tu as aussi la colonne ClientProcessID qui te donne l'identifiant du processus client pour vérifier qu'il s'agit bien de la même application cliente.
    Oui c'est bien le même SPID (je filtre dessus en fait) et c'est aussi toujours le même ClientProcessId...

    Est il possible de savoir si c'est un trigger qui provoque ces erreurs et si oui comment et lequel ??

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2009
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 118
    Points : 27
    Points
    27
    Par défaut
    Citation Envoyé par darkelend Voir le message
    Tu peux valider la majorité de tes procédures stockées avec cet outil (évites de le tester en prod, utilises plutôt un environnement de test).
    Si tu mets hors de cause tes procédures stockées, comme tu le dis dans ton premier message, regardes du coté des triggers.
    Ok merci je vais regarder la validation des PS avec cet outil... mais sur un serveur de test. bien sûr !!

  8. #8
    Expert confirmé
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Points : 4 043
    Points
    4 043
    Par défaut
    peut-être y a-t-il dans tes procédures PontClient_Update... une instruction juste avant l'UPDATE qui comporte une erreur. Tu peux poster le code s'il n'y a rien de confidentiel.

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2009
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 118
    Points : 27
    Points
    27
    Par défaut
    Citation Envoyé par rudib Voir le message
    peut-être y a-t-il dans tes procédures PontClient_Update... une instruction juste avant l'UPDATE qui comporte une erreur. Tu peux poster le code s'il n'y a rien de confidentiel.
    Pas de problème : voici deux des procédures qui posent problème (il semble y en avoir plein d'autres)

    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
     
    CREATE PROCEDURE [dbo].[PontClient_UpdateStatusMorTrans]
    AS
    	UPDATE
    		[dbo].[MOR_TRANS]
    	SET
    		STATUS = 2,
    		DATE_TRAITEMENT = GETDATE()
    	FROM
    		[TracePrep].[UP] UP
    	JOIN
    		[TracePrep].[UP_DOCUMENT] UPD
    	ON
    		UPD.NO_UP = UP.NO_UP
    	WHERE
    		UP.CODE_UP = ID_CARTON
    		AND UPD.NOM_FICHIER = FICHIER_ETIQUETTE
    		AND STATUS = 1
    GO
    et la deuxième :

    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 PROCEDURE [dbo].[PontClient_UpdateStatusRestantMorTrans]
    AS
    	UPDATE
    		[dbo].[MOR_TRANS]
    	SET
    		STATUS = 2,
    		DATE_TRAITEMENT = GETDATE(),
    		CODE_ERREUR = EPC.NO_ERREUR,
    		MESSAGE_ERREUR = EPC.LIBELLE
    	FROM
    		[dbo].[ERREUR_PONT_CLIENT] EPC
    	WHERE
    		STATUS = 1
    		AND EPC.CODE_ERREUR = 'INCONNU'
    		AND DATE_CREATION < DATEADD( SECOND, -60, GETDATE() ) 
    GO
    Après vérification, il n'y a pas de trigger sur la table dbo.MOR_TRANS
    Donc je suis sec...

    J'ai pas encore passé l'outil de validation cependant....

  10. #10
    Expert confirmé
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Points : 4 043
    Points
    4 043
    Par défaut
    Bon, ça a l'air pas mal, des UPDATE tout simples. S'il d'agissait de triggers, tu les verrais dans les SP:StmtStarting et SP:StmtCompleted ...

    Il manque peut-être des infos ici. Peux-tu ajouter les événements :
    RPC:Starting
    RPC:Completed

    et dans T-SQL:
    SQL:StmtStarting
    SQL:StmtCompleted

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2009
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 118
    Points : 27
    Points
    27
    Par défaut
    Citation Envoyé par rudib Voir le message
    Il manque peut-être des infos ici. Peux-tu ajouter les événements :
    RPC:Starting
    RPC:Completed
    Ok c'est fait dans le screen shot suivant

    Citation Envoyé par rudib Voir le message
    et dans T-SQL:
    SQL:StmtStarting
    SQL:StmtCompleted
    Ceux la ils y sont déja....

    J'ai une remarque plus générale : je sais que nos appels de procédure stoquées ne sont pas parfiatement conformes aux best practices de Microsoft. (vous le verrez dans l'appel de RPC). J'ai l'impression que mon erreur est liée à cela aussi. Tous nos appels provoquent des cachemiss (deux en général) mais sans que je puisse expliquer pourquoi non plus. Ce point ne vous parait il lié à mon problème actuel ?




  12. #12
    Expert confirmé
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Points : 4 043
    Points
    4 043
    Par défaut
    C'est bien possible. Votre appel RPC fait un sp_cursoropen, et un des messages qui vous est renvoyé est qu'il ne peut pas le passer en curseur et qu'il exécute directement.

    Ça peut s'expliquer : sp_cursoropen essaie de créer un curseur sur une prcédure d'UPDATE qui ne retourne pas de données, donc pas possible de créer un curseur. http://technet.microsoft.com/fr-fr/l...ql.100%29.aspx

    Comment se fait-il que vous fassiez un sp_cursoropen ? Qu'est-ce que vous utilisez en bibliothèque client ? Avec quels paramètres ?

  13. #13
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2009
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 118
    Points : 27
    Points
    27
    Par défaut
    Citation Envoyé par rudib Voir le message
    Comment se fait-il que vous fassiez un sp_cursoropen ? Qu'est-ce que vous utilisez en bibliothèque client ? Avec quels paramètres ?
    Alors c'est un problème de très longue date avec nos applications car nous utilisons depuis des lustres la même DLL standard tout le temps.
    Nous développons en Qt 4 avec une connexion ODBC. La chaine de connexion utilisée est du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DRIVER={SQL Server native client 10.0};server=<ip add>;database=<mabase>;Uid=<username>;Pwd=<passw>;App=<appplicationname>
    Cependant, lorsque j'ai commencé a regarder ces problèmes, j'ai noté que le driver ODBC réagit différemment selon le texte que l'on utilise pour l'appel de la SP. (selon que l'on utilise exec, execute ou rien du tout !!)

    Nous ne préparons pas les requetes (j'ai cru comprendre que notre problème vient en partie de là). A la place on execute le statement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    execute <NomSP> <params>
    Ce qui est étonnant c'est qu'il ne me semble pas avoir ce genre de problèmes pour d'autres applications sur le même site avec la même méthode d'appel....

  14. #14
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 865
    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 865
    Points : 53 021
    Points
    53 021
    Billets dans le blog
    6
    Par défaut
    À mon avis, vous utilisez un objet de code côté client qui est fait pour de la lecture alors que vous lancez des procédures.
    Certains langage client assez bas de gamme n'offre pas de différenciation entre un objet de lecture et une mise à jour, obligeant le serveur SQL à récupérer systématiquement dans un curseur le résultat de la commande... qui ne vient jamais dans une mise à jour !

    Revoyez votre code client. Remplacez si possible votre objet client, par un autre plus adéquat. Sinon, changez de langage !

    A +

  15. #15
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2009
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 118
    Points : 27
    Points
    27
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    À mon avis, vous utilisez un objet de code côté client qui est fait pour de la lecture alors que vous lancez des procédures.
    Certains langage client assez bas de gamme n'offre pas de différenciation entre un objet de lecture et une mise à jour, obligeant le serveur SQL à récupérer systématiquement dans un curseur le résultat de la commande... qui ne vient jamais dans une mise à jour !

    Revoyez votre code client. Remplacez si possible votre objet client, par un autre plus adéquat. Sinon, changez de langage !
    A +
    Ok merci beaucoup, je vais regarder pour changer notre façon d'invoquer les procédures.

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

Discussions similaires

  1. exception dans un constructeur
    Par xxiemeciel dans le forum C++
    Réponses: 25
    Dernier message: 23/11/2005, 18h14
  2. gestionnaire d'Exception dans DLL
    Par pirbd dans le forum Langage
    Réponses: 2
    Dernier message: 03/03/2005, 18h58
  3. Capture d'exception dans un constructeur
    Par declencher dans le forum Composants VCL
    Réponses: 8
    Dernier message: 03/02/2004, 12h52
  4. Réponses: 2
    Dernier message: 28/08/2003, 00h00

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