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

Administration SQL Server Discussion :

Suivi des erreurs de type "Cannot insert duplicate key row"


Sujet :

Administration SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    FMJ
    FMJ est déconnecté
    Membre éclairé
    Profil pro
    tutu
    Inscrit en
    Octobre 2003
    Messages
    417
    Détails du profil
    Informations personnelles :
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : tutu

    Informations forums :
    Inscription : Octobre 2003
    Messages : 417
    Par défaut Suivi des erreurs de type "Cannot insert duplicate key row"
    Bonjour,

    Je souhaiterais pouvoir surveiller toutes les erreurs de type " Cannot insert duplicate key row ..... with unique index ....." (message erreur 2601), le serveur étant sous SQL Server 2000.

    D'une part, ce type d'erreur n'est pas référencé dans le journal des erreurs SQL de l'Entreprise Manager.

    D'autre part, il n'y a même pas de log ERRORLOG sur ce serveur !

    Merci d'avance pour votre aide

  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 999
    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 999
    Billets dans le blog
    6
    Par défaut
    une erreur logique (viol de contrainte) n'étant pas une erreur critique, mais fonctionnelle, elle ne sera jamais journalisée.

    Vous pouvez utiliser le profileur SQL pour trapper ce genre d'erreur.

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

  3. #3
    FMJ
    FMJ est déconnecté
    Membre éclairé
    Profil pro
    tutu
    Inscrit en
    Octobre 2003
    Messages
    417
    Détails du profil
    Informations personnelles :
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : tutu

    Informations forums :
    Inscription : Octobre 2003
    Messages : 417
    Par défaut
    Bonjour Frédéric

    Merci pour cette réponse.

    En passant, est-ce que l'absence d'un ERRORLOG sous SQL 2000 est normal ?

    Merci d'avance.

  4. #4
    Expert confirmé
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ain (Rhône Alpes)

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

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Par défaut
    En principe je dirais non.

    Que se passe t'il lorsque vous essayez d'ouvrir ce journal avec Entreprise Manager ?

    ++

  5. #5
    FMJ
    FMJ est déconnecté
    Membre éclairé
    Profil pro
    tutu
    Inscrit en
    Octobre 2003
    Messages
    417
    Détails du profil
    Informations personnelles :
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : tutu

    Informations forums :
    Inscription : Octobre 2003
    Messages : 417
    Par défaut
    Bon, j'ai mis en place une trace. Mais comme un message d'erreur est une ligne à part entière qui suit la requête (ou tout autre action) qui l'a entraîné, je suis obligé d'intercepter toutes les requêtes, même celles qui se passent très bien.

    En effet, sous SQL 2000, aucun champ discriminant n'existe pour permettre de filtrer les requêtes sans erreur.
    Je vais juste me retrouver avec un volume de log de 100Mo par jour .......

  6. #6
    FMJ
    FMJ est déconnecté
    Membre éclairé
    Profil pro
    tutu
    Inscrit en
    Octobre 2003
    Messages
    417
    Détails du profil
    Informations personnelles :
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : tutu

    Informations forums :
    Inscription : Octobre 2003
    Messages : 417
    Par défaut
    Dans Entreprise Manager, il y a bien un journal de log qui est "peuplé".

    Mais le répertoire ...\Program Files\Microsoft SQL Server\MSSQL\Log n'existe pas et je ne trouve pas de fichier ERRORLOG.

  7. #7
    Membre Expert
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 056
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 056
    Par défaut
    Il faudrait regarder la commande démarrage du SQL Server (via le SQL Server Manager). Suivez le chemin donné par l'option -e, c'est là qu'il est


    En effet, sous SQL 2000, aucun champ discriminant n'existe pour permettre de filtrer les requêtes sans erreur.
    As-tu essayé par exemple l'évènement SQL:BatchCompleted filtré sur le champ Error=2601 ?

  8. #8
    Membre émérite
    Profil pro
    Inscrit en
    Février 2008
    Messages
    758
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 758
    Par défaut
    Citation Envoyé par FMJ Voir le message
    D'une part, ce type d'erreur n'est pas référencé dans le journal des erreurs SQL de l'Entreprise Manager.
    Hello,

    Pour faire logger les messages serveur dans l'errorlog, tu peux modifier les propriétés du message pour lui indiquer de logger spécifiquement l'erreur dans l'errorlog:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    exec sp_altermessage @message_id=2601,@parameter='WITH_LOG',@parameter_value='TRUE';
    GO
    David B.

  9. #9
    FMJ
    FMJ est déconnecté
    Membre éclairé
    Profil pro
    tutu
    Inscrit en
    Octobre 2003
    Messages
    417
    Détails du profil
    Informations personnelles :
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : tutu

    Informations forums :
    Inscription : Octobre 2003
    Messages : 417
    Par défaut
    OK, merci pour la précision

  10. #10
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 999
    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 999
    Billets dans le blog
    6
    Par défaut
    Attention, car si les utilisateurs courant n'ont pas le privilège sysadmin, vous risquez de générer des erreurs supplémentaires en utilisant le WITH LOG...

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

  11. #11
    FMJ
    FMJ est déconnecté
    Membre éclairé
    Profil pro
    tutu
    Inscrit en
    Octobre 2003
    Messages
    417
    Détails du profil
    Informations personnelles :
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : tutu

    Informations forums :
    Inscription : Octobre 2003
    Messages : 417
    Par défaut
    OK, je vais vérifier.

    Par contre, je rencontre plusieurs problèmes avec ma petite technique d'enregistrement et d'épuration des logs dans une table :

    > L'écriture des logs dans la table par le Profiler est interrompue par ma requête de suppression des logs sans erreurs
    "Echec de l'enregistrement des données de trace dans la table"
    --> J'ai donc voulu passer par 2 tables : Une table "TRACE" pour l'enregistrement de tous les logs et une autre "ERROR" pour la copie des logs d'erreur à conserver. L'idée serait d'arrêter deux fois par jour l'écriture de la trace dans la table "TRACE", de faire en suivant la copie dans la table "ERROR", puis de relancer la trace dans "TRACE" (cette action entraîne la suppression de tous les logs déjà enregistrés).

    > Le problème, c'est qu'il est visiblement pas possible d'automatiser la trace avec enregistrement dans une table. Lorsque j'enregistre le script SQL correspondant à la trace, j'obtiens le code et les commentaires suivants :
    -- Writing to a table is not supported through the SP's

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    /****************************************************/
    /* Created by: SQL Profiler                         */
    /* Date: 27/07/2010  16:46:10         */
    /****************************************************/
     
     
    -- Create a Queue
    declare @rc int
    declare @TraceID int
    declare @maxfilesize bigint
    set @maxfilesize = 5 
     
    -- Please replace the text InsertFileNameHere, with an appropriate
    -- filename prefixed by a path, e.g., c:\MyFolder\MyTrace. The .trc extension
    -- will be appended to the filename automatically. If you are writing from
    -- remote server to local drive, please use UNC path and make sure server has
    -- write access to your network share
     
    exec @rc = sp_trace_create @TraceID output, 0, N'InsertFileNameHere', @maxfilesize, NULL 
    if (@rc != 0) goto error
     
    -- Client side File and Table cannot be scripted
     
    -- Writing to a table is not supported through the SP's
     
    -- Set the events
    declare @on bit
    set @on = 1
    exec sp_trace_setevent @TraceID, 11, 1, @on
    exec sp_trace_setevent @TraceID, 11, 3, @on
    exec sp_trace_setevent @TraceID, 11, 10, @on
    exec sp_trace_setevent @TraceID, 11, 11, @on
    [etc...................]
    exec sp_trace_setevent @TraceID, 82, 34, @on
    exec sp_trace_setevent @TraceID, 82, 35, @on
    exec sp_trace_setevent @TraceID, 82, 40, @on
     
     
    -- Set the Filters
    declare @intfilter int
    declare @bigintfilter bigint
     
    set @intfilter = 10
    exec sp_trace_setfilter @TraceID, 3, 1, 0, @intfilter
     
    set @intfilter = 0
    exec sp_trace_setfilter @TraceID, 31, 0, 1, @intfilter
     
     
     
    -- Set the trace status to start
    exec sp_trace_setstatus @TraceID, 1
     
    -- display trace id for future references
    select TraceID=@TraceID
    goto finish
     
    error: 
    select ErrorCode=@rc
     
    finish: 
    go
    Donc je suis un peu coincé ..... Je ne peux laisser la table "LOGS" grossir de 1Go par jour.

    Vous n'auriez pas une idée ?

  12. #12
    Expert confirmé
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ain (Rhône Alpes)

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

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Par défaut
    Chez un de mes anciens clients, on utilisé un processus qui était le suivant :

    1er job : (Serveur de prod)
    - Démarrage d'une trace à une heure déterminée
    2eme job : (Server de prod)
    - Arrêt de la trace XX heures après le redémarrage
    - Déplacement du fichier de trace sur un serveur qui enregistre les log
    3eme job : (sur le serveur de log)
    - Si fichier trace présent alors insertion des logs dans une table

    Vous pourriez par exemple définir pour le 3eme job un traitement supplémentaire pour copier les requêtes concernées.

    ++

  13. #13
    Membre Expert
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 056
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 056
    Par défaut
    -- Writing to a table is not supported through the SP's
    Je n'ai jamais compris cette limitation. Permettre la génération dans une table via le programme et l'interdire lorsqu'on passe par les traces SQL Server, cela me semble quelque illogique. Si qqn a une explication, je suis preneur

    Comme l'indique mikedavem, il vous suffit de charger le fichier résultat de la trace comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT *  into TABLE FROM :: fn_trace_gettable (N'z:\monfichiet.trc', 1)
    Vous pouvez également créer la table en avance si besoin.

Discussions similaires

  1. Réponses: 2
    Dernier message: 21/10/2014, 15h44
  2. Merge insert duplicate key in object index
    Par americ dans le forum Langage SQL
    Réponses: 4
    Dernier message: 10/06/2014, 16h16
  3. Requête insert + duplicate key update
    Par sfpx dans le forum Requêtes
    Réponses: 5
    Dernier message: 01/05/2012, 07h16
  4. Thread avec des erreurs de type AccessViolation
    Par cvexxx dans le forum Langage
    Réponses: 3
    Dernier message: 13/02/2009, 09h34
  5. Réponses: 6
    Dernier message: 09/06/2006, 12h17

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