Comment vérifier si une Contrainte existe dans Sql server?

j'ai ce sql:

ALTER TABLE dbo.ChannelPlayerSkins
    DROP CONSTRAINT FK_ChannelPlayerSkins_Channels

mais apparemment, sur d'autres bases de données que nous utilisons, la contrainte a un nom différent. Comment puis-je vérifier s'il y a une contrainte avec le nom FK_ChannelPlayerSkins_Channels .

216
demandé sur KM. 2010-03-23 14:11:30

13 réponses

essayez ceci:

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

-- EDIT --

quand j'ai répondu à cette question, je pensais "clé étrangère" parce que la question originale demandait de trouver "FK_ChannelPlayerSkins_Channels". Depuis lors, de nombreuses personnes ont commenté sur la recherche d'autres "contraintes" voici quelques autres questions pour cela:

--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 de plus d'informations sur les contraintes, consultez la procédure master.sys.sp_helpconstraint pour savoir comment obtenir certaines informations. Pour visualiser le code source en utilisant SQL Server Management Studio, allez dans"L'Explorateur D'objets". De là, vous développez la base de données "Master", puis la "programmabilité", puis les "procédures stockées", puis les "procédures stockées dans le système". Vous pouvez alors trouver " sys.sp_helpconstraint" et cliquez droit dessus et sélectionnez "modifier". Il faut juste faire attention de ne pas sauver tout les modifications. En outre, vous pouvez juste utiliser ce système stocké procédure sur n'importe quelle table en l'utilisant comme EXEC sp_helpconstraint YourTableNameHere .

284
répondu KM. 2014-08-19 13:36:55

la façon la plus simple de vérifier l'existence d'une contrainte (et de 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 second paramètre ('C' pour vérifier les contraintes seulement) et cela peut aussi fonctionner, mais si votre nom de 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és étrangères ou primaires, etc. Pour de meilleurs résultats, incluez toujours le type d'objet approprié comme second paramètre pour la fonction OBJECT_ID:

Contrainte Types D'Objet:

  • c = contrainte de contrôle
  • D = par DÉFAUT (contrainte ou stand-alone)
  • F = FOREIGN KEY constraint
  • PK = Contrainte principale
  • R = Règle (vieux style, stand-alone)
  • UQ = UNIQUE constraint

notez Également que le schéma est souvent nécessaire. Le schéma des contraintes prend généralement le schéma de la table mère.

le fait de ne pas mettre vos contraintes (ou ce que vous vérifiez) entre parenthèses lors de l'utilisation de cette méthode peut aussi causer un faux négatif -- si votre objet utilise des caractères inhabituels (comme un .), les crochets sont nécessaires.

197
répondu EricI 2015-08-20 23:46:07

si vous cherchez un autre type de contrainte, par exemple par défaut, vous devez utiliser une requête différente (De Comment trouver une contrainte par défaut en utilisant INFORMATION_SCHEMA? , a répondu par devio ). Use:

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

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

j'ai mis ensemble différent 'IF not Exists" checks in my post" DDL 'IF not Exists" conditions pour faire des scripts SQL re-praticable"

40
répondu Michael Freidgeim 2017-05-23 11:47:31
IF (OBJECT_ID('FK_ChannelPlayerSkins_Channels') IS NOT NULL)
25
répondu DevDave 2012-06-01 08:10:07

êtes-vous en train de regarder quelque chose comme cela, ci-dessous a été 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]')
19
répondu asyncwait 2010-03-23 11:18:52

juste quelque chose à surveiller......

Dans SQL Server 2008 R2 SSMS, le Script "Contrainte -> supprimer Et CRÉER" commande produit T-SQL comme ci-dessous

USE [MyDatabase]
GO

IF  EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[DEF_Detail_IsDeleted]') AND type = 'D')
BEGIN
ALTER TABLE [Patient].[Detail] DROP CONSTRAINT [DEF_Detail_IsDeleted]
END

GO

USE [MyDatabase]
GO

ALTER TABLE [Patient].[Detail] ADD  CONSTRAINT [DEF_Detail_IsDeleted]  DEFAULT ((0)) FOR [IsDeleted]
GO

sorti de la boîte, ce script ne supprime pas la contrainte car le SELECT renvoie 0 lignes. (voir post Microsoft Connect ).

le nom de la contrainte par défaut est erroné mais je crois comprendre qu'il a aussi quelque chose à voir avec la fonction OBJECT_ID parce que changer le nom ne règle pas le problème.

pour corriger cela, j'ai supprimé L'usage de OBJECT_ID et utilisé le nom de la contrainte par défaut à la place.

(SELECT * FROM dbo.sysobjects WHERE [name] = (N'DEF_Detail_IsDeleted') AND type = 'D')
8
répondu Mike1234 2012-06-21 22:04:03

j'utilise la requête suivante pour vérifier une contrainte existante avant de la créer.

IF (NOT EXISTS(SELECT 1 FROM sysconstraints WHERE OBJECT_NAME(constid) = 'UX_CONSTRAINT_NAME' AND OBJECT_NAME(id) = 'TABLE_NAME')) BEGIN
...
END

cette requête pour la contrainte par nom ciblant un nom de table donné. Espérons que cette aide.

6
répondu Christo 2014-06-17 08:46:28
IF EXISTS(SELECT 1 FROM sys.foreign_keys WHERE parent_object_id = OBJECT_ID(N'dbo.TableName'))
 BEGIN 
ALTER TABLE TableName DROP CONSTRAINT CONSTRAINTNAME 
END 
3
répondu StackOrder 2014-09-19 07:16:08

INFORMATION_SCHEMA est votre ami. Il a toutes sortes de vues qui montrent toutes sortes d'informations de schéma. Vérifiez vos vues système. Vous trouverez que vous avez trois vues traitant des contraintes, l'une étant CHECK_CONSTRAINTS.

2
répondu TomTom 2010-03-23 11:14:31
IF EXISTS(SELECT TOP 1 1 FROM sys.default_constraints WHERE parent_object_id = OBJECT_ID(N'[dbo].[ChannelPlayerSkins]') AND name = 'FK_ChannelPlayerSkins_Channels')
BEGIN
    DROP CONSTRAINT FK_ChannelPlayerSkins_Channels
END
GO
2
répondu Tim Masters 2017-08-22 17:52:42

j'utilise ceci pour vérifier et distancer les contraintes sur une colonne. Il devrait avoir tout ce dont vous avez besoin.

DECLARE
  @ps_TableName VARCHAR(300)
  , @ps_ColumnName VARCHAR(300)

SET @ps_TableName = 'mytable'
SET @ps_ColumnName = 'mycolumn'

DECLARE c_ConsList CURSOR LOCAL STATIC FORWARD_ONLY FOR
    SELECT
    'ALTER TABLE ' + RTRIM(tb.name) + ' drop constraint ' + sco.name AS csql
    FROM
        sys.Objects tb
        INNER JOIN sys.Columns tc on (tb.Object_id = tc.object_id)
        INNER JOIN sys.sysconstraints sc ON (tc.Object_ID = sc.id and tc.column_id = sc.colid)
        INNER JOIN sys.objects sco ON (sc.Constid = sco.object_id)
    where
        tb.name=@ps_TableName
        AND tc.name=@ps_ColumnName
OPEN c_ConsList
FETCH c_ConsList INTO @ls_SQL
WHILE (@@FETCH_STATUS = 0) BEGIN

    IF RTRIM(ISNULL(@ls_SQL, '')) <> '' BEGIN
        EXECUTE(@ls_SQL)
    END
    FETCH c_ConsList INTO @ls_SQL
END
CLOSE c_ConsList
DEALLOCATE c_ConsList
1
répondu user2196815 2013-07-12 18:24:20
SELECT tabla.name as Tabla,

        restriccion.name as Restriccion, 
        restriccion.type as Tipo, 
        restriccion.type_desc as Tipo_Desc
FROM {DATABASE_NAME}.sys.objects tabla 

INNER JOIN {DATABASE_NAME}.sys.objects restriccion

ON tabla.object_id = restriccion.parent_object_id

WHERE tabla.type = 'U' - Solo tablas creadas por el usuario.

AND restriccion.type = 'UQ' --Tipo de Restriccion UNIQUE

ORDER BY tabla.name, restriccion.type_desc                
1
répondu Christhian 2014-10-28 18:32:14

vous pouvez utiliser celui ci-dessus avec une mise en garde:

IF EXISTS(
    SELECT 1 FROM sys.foreign_keys 
    WHERE parent_object_id = OBJECT_ID(N'dbo.TableName') 
        AND name = 'CONSTRAINTNAME'
)
BEGIN 
    ALTER TABLE TableName DROP CONSTRAINT CONSTRAINTNAME 
END 

doit utiliser le name = [Constraint name] puisqu'une table peut avoir plusieurs clés étrangères et n'a toujours pas la clé étrangère vérifiée pour

1
répondu alaniane 2018-02-26 13:15:26