343 votes

Comment vérifier si une contrainte existe dans le serveur Sql ?

J'ai ce SQL :

ALTER TABLE dbo.ChannelPlayerSkins
    DROP CONSTRAINT FK_ChannelPlayerSkins_Channels

mais apparemment, sur certaines autres bases de données que nous utilisons, la contrainte porte un nom différent. Comment puis-je vérifier s'il existe une contrainte portant le nom suivant FK_ChannelPlayerSkins_Channels .

0 votes

2 votes

Beaucoup des réponses données ici échouent lorsque le même nom de contrainte est utilisé sur plusieurs objets ou dans un autre schéma.

433voto

KM. Points 51800

Essayez ceci :

SELECT
    * 
    FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS 
    WHERE CONSTRAINT_NAME ='FK_ChannelPlayerSkins_Channels'

-- EDIT --

Lorsque j'ai répondu à cette question, je pensais à une "clé étrangère", car la question initiale demandait de trouver "FK_ChannelPlayerSkins_Channels". Depuis, de nombreuses personnes ont fait des commentaires sur la recherche d'autres "contraintes". Voici quelques autres requêtes à ce sujet :

--Returns one row for each CHECK, UNIQUE, PRIMARY KEY, and/or FOREIGN KEY
SELECT * 
    FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
    WHERE CONSTRAINT_NAME='XYZ'  

--Returns one row for each FOREIGN KEY constrain
SELECT * 
    FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS 
    WHERE CONSTRAINT_NAME='XYZ'

--Returns one row for each CHECK constraint 
SELECT * 
    FROM INFORMATION_SCHEMA.CHECK_CONSTRAINTS
    WHERE CONSTRAINT_NAME='XYZ'

voici une autre méthode

--Returns 1 row for each CHECK, UNIQUE, PRIMARY KEY, FOREIGN KEY, and/or DEFAULT
SELECT 
    OBJECT_NAME(OBJECT_ID) AS NameofConstraint
        ,SCHEMA_NAME(schema_id) AS SchemaName
        ,OBJECT_NAME(parent_object_id) AS TableName
        ,type_desc AS ConstraintType
    FROM sys.objects
    WHERE type_desc LIKE '%CONSTRAINT'
        AND OBJECT_NAME(OBJECT_ID)='XYZ'

Si vous avez besoin d'encore plus d'informations sur les contraintes, regardez dans la procédure stockée du système master.sys.sp_helpconstraint pour voir comment obtenir certaines informations. Pour visualiser le code source à l'aide de SQL Server Management Studio, accédez à l'"Explorateur d'objets". De là, développez la base de données "Master", puis "Programmability", puis "Stored Procedures", puis "System Stored Procedures". Vous pouvez alors trouver "sys.sp_helpconstraint" et faire un clic droit dessus et sélectionner "modifier". Faites attention à ne pas enregistrer les modifications. Vous pouvez également utiliser cette procédure stockée système sur n'importe quelle table en l'utilisant comme suit EXEC sp_helpconstraint YourTableNameHere .

3 votes

Une chose à noter, dans mon SQL pour ajouter la contrainte, j'ai utilisé des crochets autour du nom comme [fk_Client_ProjectID_Project]. Vous DEVEZ supprimer les parenthèses dans la clause WHERE.

2 votes

Il n'y a rien de mal à mettre entre parenthèses. Il s'agit d'une question sur le serveur SQL, pas sur MySQL.

1 votes

S'il s'agit d'une contrainte unique, il vous faut une version légèrement différente : IF NOT EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS where CONSTRAINT_NAME = 'UNIQUE_Order_ExternalReferenceId') BEGIN ALTER TABLE Order ADD CONSTRAINT UNIQUE_Order_ExternalReferenceId UNIQUE (ExternalReferenceId) END

317voto

EricI Points 957

Le moyen le plus simple de vérifier l'existence d'une contrainte (et de faire quelque chose comme la supprimer si elle existe) est d'utiliser la fonction OBJECT_ID()...

IF OBJECT_ID('dbo.[CK_ConstraintName]', 'C') IS NOT NULL 
    ALTER TABLE dbo.[tablename] DROP CONSTRAINT CK_ConstraintName

OBJECT_ID peut être utilisé sans le deuxième paramètre ('C' pour les contraintes de contrôle uniquement) et cela peut également fonctionner, mais si le nom de votre contrainte correspond au nom d'autres objets dans la base de données, vous pouvez obtenir des résultats inattendus.

IF OBJECT_ID('dbo.[CK_ConstraintName]') IS NOT NULL 
    ALTER TABLE dbo.[tablename] DROP CONSTRAINT CK_ConstraintName

OBJECT_ID peut également être utilisé avec d'autres "contraintes" telles que les contraintes de clé étrangère ou de clé primaire, etc. Pour de meilleurs résultats, il faut toujours inclure le type d'objet approprié comme deuxième paramètre de la fonction OBJECT_ID :

Types d'objets de contrainte :

  • C = Contrainte CHECK
  • D = DEFAUT (contrainte ou autonome)
  • F = Contrainte FOREIGN KEY
  • PK = contrainte PRIMARY KEY
  • R = Règle (ancien style, autonome)
  • UQ = Contrainte UNIQUE

Notez également que le schéma est souvent requis. Le schéma des contraintes reprend généralement le schéma de la table parente.

Le fait de ne pas mettre vos contraintes (ou tout ce que vous vérifiez) entre parenthèses lorsque vous utilisez cette méthode peut également entraîner un faux négatif -- si votre objet utilise des caractères inhabituels (comme un .), les parenthèses sont nécessaires.

20 votes

L'important est d'ajouter le nom du schéma dans le paramètre de OBJECT_ID comme ceci : IF OBJECT_ID('dbo.CK_ConstraintName', 'C') IS NOT NULL. Sans spécifier de schéma, il renvoie NULL.

0 votes

Bonjour, merci pour votre réponse, elle est très utile. Je me demande juste si elle s'applique à Oracle ?

0 votes

Ne fonctionne pas sur sql2000. Il suffit d'utiliser OBJECTPROPERTY(OBJECT_ID('constraint_name'), 'IsConstraint') = 1 pour être compatible de la version actuelle jusqu'à sql2000. Non dbo schéma requis également.

48voto

Michael Freidgeim Points 4002

Si vous recherchez un autre type de contrainte, par exemple des valeurs par défaut, vous devez utiliser une autre requête. (De Comment trouver une contrainte par défaut en utilisant INFORMATION_SCHEMA ? répondu par devio ). Utilisez :

SELECT * FROM sys.objects WHERE type = 'D' AND name = @name

pour trouver une contrainte par défaut par son nom.

J'ai mis en place différentes vérifications "IF not Exists" dans mon article " Conditions DDL "IF not Exists" pour rendre les scripts SQL ré-exécutables".

31voto

DevDave Points 2095
IF (OBJECT_ID('FK_ChannelPlayerSkins_Channels') IS NOT NULL)

0 votes

Il s'avère que j'ai dû ajouter le nom du schéma, cf. stackoverflow.com/questions/29680286/

20voto

asyncwait Points 1745

Vous cherchez quelque chose comme ceci, ci-dessous est testé dans SQL Server 2005

SELECT * FROM sys.check_constraints WHERE 
object_id = OBJECT_ID(N'[dbo].[CK_accounts]') AND 
parent_object_id = OBJECT_ID(N'[dbo]. [accounts]')

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X