2013-07-06 15 views
6

Ho il seguente:Come posso verificare se esiste un vincolo di SQL Server?

IF OBJECT_ID(N'[dbo].[webpages_Roles_UserProfiles_Target]', 'xxxxx') IS NOT NULL 
    DROP CONSTRAINT [dbo].[webpages_Roles_UserProfiles_Target] 

Voglio essere in grado di verificare se v'è un vincolo esistente prima di cadere. Io uso il codice sopra con un tipo di 'U' per le tabelle.

Come è possibile modificare il codice precedente (modificare xxxx) per verificare l'esistenza del vincolo?

risposta

20
SELECT 
    * 
    FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS 

oppure provare questo

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' 

o

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 
+0

Se la tabella ha PK, fare qualcosa di simile, se esiste (SELECT Nome FROM sysobjects dove xtype = 'PK' E parent_obj = OBJECT_ID ('Tablename')) INIZIANO ALTER TABLE Tablename GOCCIA VINCOLO ConstraintName FINE –

2

si può fare qualcosa di simile:

IF EXISTS 
    (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[CONSTRAINT_NAME]') 
     AND type in (N'U')) 

BEGIN 
.... 
END 
ELSE 
+3

' type in (N'U ') 'verifica l'esistenza di una tabella [non un vincolo] (http://msdn.microsoft.com/en-us/library/ms190324.aspx) –

+0

right Martin. Non includere (N'U ') per il controllo dei vincoli. –

+0

type in (N'UQ ') sarebbe corretto per verificare il tipo di un vincolo univoco. –

3

provare qualcosa di simile

0.123.
IF OBJECTPROPERTY(OBJECT_ID('constraint_name'), 'IsConstraint') = 1 
    ALTER TABLE table_name DROP CONSTRAINT constraint_name 
+0

IF OBJECT_ID ('Schema.keyname') IS NULL ALTER TABLE Schema.tablename ADD CONSTRAINT keyname ... –

+0

@MartinB Sì, questo sembra un bel collegamento per 'ADD CONSTRAINT'! Per 'DROP CONSTRAINT' il salto' IsConstraint' controlla l'errore 'ALTER TABLE' dato che' OBJECT_ID' restituisce un valore non nullo se 'Schema.keyname' è un indice o una tabella. – wqw

Problemi correlati