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 :

Violation of PRIMARY KEY constraint


Sujet :

Développement SQL Server

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    430
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2006
    Messages : 430
    Points : 103
    Points
    103
    Par défaut Violation of PRIMARY KEY constraint
    Bonjour

    dans une job qui roule les soirs un script SQL, dès fois lorsque je regarde le "View Job history" je recois le message suivant :

    Executed as user: VECIDOR\Nathalie. Violation of PRIMARY KEY constraint 'PK_Contraine_A'. Cannot insert duplicate key in object 'TABLE_Departement'. [SQLSTATE 23000] (Error 2627) The statement has been terminated. [SQLSTATE 01000] (Error 3621). The step failed.
    Y a t-il moyen de rajouter quelques choses dans le code pour savoir exactement quelle ligne qui allait se rajouter en duplicata ?

    Je suis dans SQL server 2000

    Merci d'avance pour votre aide.

  2. #2
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Vous pouvez n'insérer que les lignes qui ne sont pas dans votre table cible dans un premier temps :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    -- Insère suelement les lignes qui ne sont pas dans maTable
    INSERT INTO maTable
    (
    	mesColonnes
    )
    SELECT A.desColonnes
    FROM dbo.autresTables AS A
    LEFT JOIN dbo.maTable AS M
    	ON A.colonnePK_A = M.colonnePK_M
    WHERE A.colonnePK_A IS NULL
    Et ensuite rechercher les lignes qui sont dans les deux tables :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    -- Recherche les lignes qui sont dans A et dans M et qui provoquent 
    SELECT  A.desColonnes
    FROM dbo.autresTables AS A
    JOIN dbo.maTable AS M
    	ON A.colonnePK_A = M.colonnePK_M
    Et les stocker dans une table supplémentaire ou marquer les lignes correspondantes comme non valides :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    UPDATE dbo.maTableSource
    SET existeDeja = 1
    FROM dbo.maTableSource AS S
    JOIN dbo.maTable AS M
    	ON S.colonne_PK_S = M.colonne_PK_M
    @++

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    430
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2006
    Messages : 430
    Points : 103
    Points
    103
    Par défaut
    Merci pour la réponse.

    Tu ne penses pas qu'il y a un autre moyen avec le try ?

    Dans la fenêtre "JOB History" on a 4 colonnes parmi lesquelle il y en a une intitulée "Result" . Cette colonne contient comme données : Failed ou Successful

    Pour un jour donné, je veux changer le libellé "Failed" pour "Successful" ?

    j'ai changé le champ run_status de 0 à 1 dans la table msdb.dbo.sysjobhistory pour ma job mais le libéllé reste parreil à "Failed"

    Merci.

    Citation Envoyé par elsuket Voir le message
    Bonjour,

    Vous pouvez n'insérer que les lignes qui ne sont pas dans votre table cible dans un premier temps :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    -- Insère suelement les lignes qui ne sont pas dans maTable
    INSERT INTO maTable
    (
        mesColonnes
    )
    SELECT A.desColonnes
    FROM dbo.autresTables AS A
    LEFT JOIN dbo.maTable AS M
        ON A.colonnePK_A = M.colonnePK_M
    WHERE A.colonnePK_A IS NULL
    Et ensuite rechercher les lignes qui sont dans les deux tables :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    -- Recherche les lignes qui sont dans A et dans M et qui provoquent 
    SELECT  A.desColonnes
    FROM dbo.autresTables AS A
    JOIN dbo.maTable AS M
        ON A.colonnePK_A = M.colonnePK_M
    Et les stocker dans une table supplémentaire ou marquer les lignes correspondantes comme non valides :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    UPDATE dbo.maTableSource
    SET existeDeja = 1
    FROM dbo.maTableSource AS S
    JOIN dbo.maTable AS M
        ON S.colonne_PK_S = M.colonne_PK_M
    @++

  4. #4
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Tu ne penses pas qu'il y a un autre moyen avec le try ?
    Comme tu es sous SQL Server 2000, tu ne peux pas utiliser le contrôle TRY ... CATCH qui a été introduit avec SQL Server 2005.
    Et même si tu étais sous SQL Server 2005, cela t'obligerait à traiter les lignes de la table source une à une :
    - s'il y avait erreur, tu la marques et tu passes à la ligne suivante
    - sinon tu copies

    Or traiter un ensemble de données en SQL ligne à ligne est contre-performant, SQL étant par nature un langage ensembliste

    @++

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    430
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2006
    Messages : 430
    Points : 103
    Points
    103
    Par défaut
    Merci.

    As tu une idée de comment faire pour changer "Failed" à "Successful" ou vice versa. Voir mon poste précédent

    Merci.

    Citation Envoyé par elsuket Voir le message
    Comme tu es sous SQL Server 2000, tu ne peux pas utiliser le contrôle TRY ... CATCH qui a été introduit avec SQL Server 2005.
    Et même si tu étais sous SQL Server 2005, cela t'obligerait à traiter les lignes de la table source une à une :
    - s'il y avait erreur, tu la marques et tu passes à la ligne suivante
    - sinon tu copies

    Or traiter un ensemble de données en SQL ligne à ligne est contre-performant, SQL étant par nature un langage ensembliste

    @++

  6. #6
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Votre job a planté, donc la table dbo.sysjobhistory de la base de données msdb reflète la réalité, et vous ne devriez donc pas mettre à jour la colonne run_status.
    Sachez que les mises à jour de tables système dès SQL Server 2005 est impossible

    @++

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    430
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2006
    Messages : 430
    Points : 103
    Points
    103
    Par défaut
    Oui bien sûr je sais, c'est parce que je suis en phase de développement et voulais juste faire avancer le travail du fait que le travail a été bien sur les tables.

    Merci parreil.
    Citation Envoyé par elsuket Voir le message
    Votre job a planté, donc la table dbo.sysjobhistory de la base de données msdb reflète la réalité, et vous ne devriez donc pas mettre à jour la colonne run_status.
    Sachez que les mises à jour de tables système dès SQL Server 2005 est impossible

    @++

Discussions similaires

  1. [2012] MERGE - Violation of PRIMARY KEY constraint
    Par vinch999 dans le forum Développement
    Réponses: 2
    Dernier message: 21/01/2015, 10h35
  2. Réponses: 2
    Dernier message: 21/10/2014, 15h44
  3. Violation of Primary Key sans données
    Par Baquardie dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 26/01/2010, 19h41
  4. probleme Violation of unique key constraint et SSIS
    Par housni dans le forum MS SQL Server
    Réponses: 0
    Dernier message: 07/08/2007, 16h28
  5. Message d'erreur 'violation of FOREIGN KEY constraint' de Interbase
    Par abdelghani_k dans le forum Bases de données
    Réponses: 3
    Dernier message: 03/06/2007, 09h11

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