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 :

Modifier un alter table constraint foreign key


Sujet :

MS SQL Server

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 20
    Par défaut Modifier un alter table constraint foreign key
    Bonjour,

    je désire supprimer une contrainte de clés étrangères. Le problème est que le nom de la contrainte a été générée automatique avec la commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     ALTER TABLE table ADD FOREIGN KEY Cle REFERENCES Price Cle;
    Pour la supprimer pas de problème c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ALTER TABLE Job DROP CONSTRAINT nom_contrainte
    Pour récupérer le nom de la contrainte c'est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT CONSTRAINT_NAME 
    	FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
    	WHERE (TABLE_NAME = 'JOB') AND (CONSTRAINT_NAME LIKE '%Cle%')
    Jusque là facile....


    Maintenant le problème c'est que je veux faire ca en automatique.
    J'ai trouvé cette facon de faire qui m'affiche a la fin la bonne requete :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT 'ALTER TABLE table DROP CONSTRAINT '+ CONSTRAINT_NAME 
    	FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
    	WHERE (TABLE_NAME = 'JOB') AND (CONSTRAINT_NAME LIKE '%Cle%')
    Mais j'ai l'impression que la commande après ne s'exécute pas.

    J'ai aussi essayé de passer par des procédures et fonction avec pointeur sur le résultat mais je n'y arrive pas non plus quelqu'un aurait-il une idée?

    Merci d'avance.

  2. #2
    Membre expérimenté
    Inscrit en
    Février 2006
    Messages
    185
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 185
    Par défaut
    si c'est exactement avec cette requete que tu le generes, c'est sur que ca ne marchera jamais.

    Si je regardes bien, tu essayes de supprimer les contraintes d'une table JOB.
    Ca devrait etre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT 'ALTER TABLE JOB DROP CONSTRAINT '+ CONSTRAINT_NAME 
    	FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
    	WHERE (TABLE_NAME = 'JOB') AND (CONSTRAINT_NAME LIKE '%Cle%')

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 20
    Par défaut
    Merci pour cette précision mais c'est ce que j'ai fait: table est remplacé par job:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT 'ALTER TABLE Job DROP CONSTRAINT '+ CONSTRAINT_NAME 
    	FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
    	WHERE (TABLE_NAME = 'JOB') AND (CONSTRAINT_NAME LIKE '%ParentJobId%')
    Quand j'exécute ca en ms-dos avec dans la console j'ai bien la requête écrite exactement comme il faut. Quand je la copie et colle dans l'utilitaire de requete MS SQL ça fait exactement ce que je souhaite.

    Mais en fait c'est comme si il ne l'avais pas exécuté quand je lance le script:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cmd /k osql -S (local) -n -e -i "clear.sql" -U user -P pass
    Je pensais peut etre la mettre dans une variable et exécuter cette variable ensuite.

    As - tu une idée?

  4. #4
    Membre expérimenté
    Inscrit en
    Février 2006
    Messages
    185
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 185
    Par défaut
    qu'est ce que tu veux faire concrétement.
    On a l'impression que tu veux que executer le script que tu as generé avec cette requete.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 20
    Par défaut
    Merci d'avoir demander des précisions.

    Concrètement je veux supprimer une contrainte.
    Pour supprimer une contrainte il faut connaitre son nom.
    Donc j'arrive à récupérer son nom et j'arrive à la supprimer quand je mets moi meme son nom dans la requete de suppression.

    Mon problème c'est que je voudrais que cela soit fait automatiquement. Que le résultat de ma requête de SELECT soit mise à la fin de ma requete de ALTER TABLE qui va supprimer la contrainte de clés étrangères.

    Donc pour ca ya la requete SELECT 'ALTER TABLE ... qui va me construire ma requête. Le problème c'est qu'elle est construite correctement, mais elle n'est pas exécuter parce que ma contrainte existe toujours après. Juste pour préciser , la commande générer par cette requête fonctionne correctement. Je ne sais pas comment l'exécuter.

  6. #6
    Membre expérimenté
    Inscrit en
    Février 2006
    Messages
    185
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 185
    Par défaut
    Ah ok, je vois
    Tu peux utiliser un curseur pour le faire directement.
    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
    DECLARE @constraintes varchar(40)
     
    DECLARE constraintes CURSOR FOR
    SELECT  CONSTRAINT_NAME 
    	FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
    	WHERE (TABLE_NAME = 'JOB') AND (CONSTRAINT_NAME LIKE '%ParentJobId%')
     
    OPEN constraintes
    FETCH NEXT FROM constraintes
    INTO @constraintes
    WHILE @@FETCH_STATUS = 0
    BEGIN
       ALTER TABLE JOB DROP CONSTRAINT @constraintes
       FETCH NEXT FROM constraintes
       INTO @constraintes
     
    END
     
    CLOSE constraintes
    DEALLOCATE constraintes
    GO
    Ceci supprimera toutes les contraintes de ta table JOB

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 20
    Par défaut
    J'avais déjà utilisé les curseurs avec un procédure pour le drop et ça ne marche pas non plus.

    Voici le message d'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Msg 170, Level 15, State 1, Server SKISS, Line 16
    Line 16: Incorrect syntax near '@constraintes'.
    Et voici le code copié:
    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
    DECLARE @constraintes varchar(40)
     
    DECLARE constraintes CURSOR FOR
    SELECT  CONSTRAINT_NAME 
    	FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
    	WHERE (TABLE_NAME = 'JOB') AND (CONSTRAINT_NAME LIKE '%ParentJobId%')
     
    OPEN constraintes
    FETCH NEXT FROM constraintes
    INTO @constraintes
    WHILE @@FETCH_STATUS = 0
    BEGIN
       ALTER TABLE JOB DROP CONSTRAINT @constraintes
       FETCH NEXT FROM constraintes
       INTO @constraintes
     
    END
     
    CLOSE constraintes
    DEALLOCATE constraintes
    GO

  8. #8
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 997
    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 997
    Billets dans le blog
    6
    Par défaut
    Il faut utiliser du SQL dynamique :

    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
    DECLARE @constraintes SYSNAME,
            @SQL NVARCHAR(4000);
     
    DECLARE constraintes CURSOR 
    FOR
        SELECT CONSTRAINT_NAME 
    	FROM   INFORMATION_SCHEMA.TABLE_CONSTRAINTS
    	WHERE  TABLE_NAME = 'JOB'
          AND  TABLE_SCHEMA = 'dbo'
          AND  CONSTRAINT_NAME LIKE '%ParentJobId%';
     
    OPEN constraintes;
     
    FETCH constraintes INTO @constraintes;
     
    WHILE @@FETCH_STATUS = 0
    BEGIN
     
       SET @SQL = 'ALTER TABLE dbo.JOB DROP CONSTRAINT ' +  @constraintes;
     
       EXEC (@SQL);
     
       FETCH constraintes INTO @constraintes;
     
    END;
     
    CLOSE constraintes;
     
    DEALLOCATE constraintes;
     
    GO
    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/ * * * * *

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 20
    Par défaut
    Parfait

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

Discussions similaires

  1. Newbie PgSQL->Probleme Creation de table avec FOREIGN KEY
    Par ralkif dans le forum PostgreSQL
    Réponses: 9
    Dernier message: 07/03/2006, 21h59
  2. Création d'une table avec foreign key.
    Par Paulinho dans le forum Débuter
    Réponses: 6
    Dernier message: 01/12/2005, 18h47
  3. [mysql]table avec foreign key
    Par samjung dans le forum Langage SQL
    Réponses: 24
    Dernier message: 24/11/2005, 14h42
  4. Création d'une table avec foreign key
    Par lepierre dans le forum Langage SQL
    Réponses: 5
    Dernier message: 17/09/2004, 14h20
  5. Probleme 'ALTER TABLE' et 'FOREIGN KEY'
    Par maahta dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 30/09/2003, 14h25

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