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 :

DROP CONSTRAINT sans connaitre le nom par script sql [2012]


Sujet :

MS SQL Server

  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2014
    Messages : 2
    Points : 3
    Points
    3
    Par défaut DROP CONSTRAINT sans connaitre le nom par script sql
    Bonjour,

    je cherche à supprimer une contrainte d'une table en passant par un script sql.Cette contrainte n'a pas été nommée la première fois.

    J'ai essayé de faire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    DECLARE @Constraint VARCHAR(100)
     
     
    SELECT @Constraint=OBJECT_NAME(object_id) 
     FROM    sys.objects
    WHERE   type_desc LIKE 'DEFAULT%CONSTRAINT'
    and OBJECT_NAME(parent_object_id)='nom de ma table'
     
    PRINT @Constraint
     
    ALTER TABLE dbo.nom de ma table DROP CONSTRAINT @Constraint
    go
    Mais cela ne fonctionne pas.
    Il n'est pas possible non plus de faire un select directement lors du DROP CONSTRAINT.

    Je précise que je n'ai qu'une contrainte de type 'DEFAULT%CONSTRAINT' sur ma table.

    Quelle est la solution ?
    Je n'ai pas trouvé d'exemple sur le msdn ou je n'ai pas utilisé les bons termes.

    Merci à vous

  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,

    En effet, si nous regardons la documentation sur l'instruction ALTER TABLE, on ne peut pas spécifier de variable pour le nom d'une contrainte.
    De manière générale d'ailleurs, cette instruction ne permet pas l'utilisation de variables.

    Il faut donc s'en remettre à du code T-SQL dynamique, c'est à dire une chaîne de requête construite à la volée, et que l'on soumet finalement au moteur de bases de données à l'aide de la procédure stockée système sp_executesql :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    DECLARE @sql nvarchar(max)
    	, @schema_name sysname = 'dbo'
    	, @table_name sysname = 'maTable'
    	, @constraint_name sysname = 'maContrainte'
     
    SELECT	@sql = 'ALTER TABLE ' + @schema_name + '.' + @table_name
    		+ ' DROP CONSTRAINT ' + @constraint_name
    FROM	sys.objects
    WHERE	type_desc = 'DEFAULT_CONSTRAINT'
    AND	parent_object_id = OBJECT_ID(@schema_name + '.' + @table_name)
    AND	name = @constraint_name;
     
    EXEC sp_executesql @sql;
    De manière générale, veillez à conserver autant que cela est possible la colonne comme l'un des membres d'un prédicat.
    Ainsi, nous changeons :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND OBJECT_NAME(parent_object_id)='nom de ma table'
    par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    parent_object_id = OBJECT_ID('nom de ma table')
    Si vous souhaitez industrialiser la chose :

    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
    CREATE PROCEDURE contrainteDefault_supprime
    	@table_name sysname
    	, @constraint_name sysname
    	, @schema_name sysname = 'dbo' -- prend par défaut la valeur "dbo" : paramètre optionnel.
    AS
    BEGIN
    	SET NOCOUNT ON
     
    	IF EXISTS
    	(
    		SELECT	*
    		FROM	sys.objects
    		WHERE	type_desc = 'DEFAULT_CONSTRAINT'
    		AND	parent_object_id = OBJECT_ID(@schema_name + '.' + @table_name)
    		AND	name = @constraint_name
    	)
    	BEGIN
    		DECLARE @sql nvarchar(max);
     
    		SELECT	@sql = 'ALTER TABLE ' + @schema_name + '.' + @table_name
    				+ ' DROP CONSTRAINT ' + @constraint_name
    		FROM	sys.objects
    		WHERE	type_desc = 'DEFAULT_CONSTRAINT'
    		AND	parent_object_id = OBJECT_ID(@schema_name + '.' + @table_name)
    		AND	name = @constraint_name;
     
    		EXEC sp_executesql @sql;
    	END
    	ELSE
    	BEGIN
    		DECLARE @err_msg nvarchar(2048) = 'La contrainte de valeur par défaut "' + @constraint_name
    				+ '" n''existe pas sur la table "' + @schema_name + '.' + @table_name + '"';
     
    		THROW 50000, @err_msg, 1;
    	END
    END
    GO
     
    -- Exemple
    CREATE TABLE test_default_constraint
    (
    	i tinyint NOT NULL
    		CONSTRAINT DF_test_default_constraint__i DEFAULT (5)
    )
    GO
     
    EXEC dbo.contrainteDefault_supprime
    	'test_default_constraint'
    	, 'DF_test_default_constraint__i'
    @++

  3. #3
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2014
    Messages : 2
    Points : 3
    Points
    3
    Par défaut
    Ok merci pour cette réponse et pour les conseils, je n'avais pas penser à cela.

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

Discussions similaires

  1. [VBA-E] imprimer une feuille sans connaitre le nom
    Par srame dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 19/04/2007, 10h02
  2. modifier une propriété sans connaitre son nom
    Par cyberchand dans le forum C#
    Réponses: 2
    Dernier message: 17/04/2007, 17h17
  3. Comment ouvrir un fichier sans connaitre son nom
    Par APoLLoN1234 dans le forum C++
    Réponses: 8
    Dernier message: 10/09/2006, 19h04
  4. Réponses: 4
    Dernier message: 26/05/2006, 12h39

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