Come verificare se esiste un vincolo nel server Sql?

Ho questo sql:

ALTER TABLE dbo.ChannelPlayerSkins DROP CONSTRAINT FK_ChannelPlayerSkins_Channels 

ma a quanto pare, su alcuni altri database che usiamo, il vincolo ha un nome diverso. Come faccio a verificare se esiste un vincolo con il nome FK_ChannelPlayerSkins_Channels .

prova questo:

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

— MODIFICARE —

Quando in origine ho risposto a questa domanda, stavo pensando a “Chiave straniera” perché la domanda originale chiedeva di trovare “FK_ChannelPlayerSkins_Channels”. Da allora molte persone hanno commentato di trovare altri “vincoli”, ecco alcune altre domande per questo:

 --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' 

ecco un metodo alternativo

 --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' 

Se sono necessarie ulteriori informazioni sui vincoli, consultare la procedura memorizzata del sistema master.sys.sp_helpconstraint per vedere come ottenere determinate informazioni. Per visualizzare il codice sorgente utilizzando SQL Server Management Studio, accedere a “Esplora oggetti”. Da lì si espande il database “Master”, quindi espandere “Programmabilità”, quindi “Stored procedure”, quindi “Sistema stored procedure”. È quindi ansible trovare “sys.sp_helpconstraint” e fare clic destro e selezionare “modifica”. Basta fare attenzione a non salvare alcuna modifica ad esso. Inoltre, puoi usare questa stored procedure di sistema su qualsiasi tabella usandolo come EXEC sp_helpconstraint YourTableNameHere .

Il modo più semplice per verificare l’esistenza di un vincolo (e quindi fare qualcosa come eliminarlo se esiste) è usare la funzione OBJECT_ID () …

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

OBJECT_ID può essere utilizzato senza il secondo parametro (‘C’ solo per i vincoli di controllo) e può anche funzionare, ma se il nome del vincolo corrisponde al nome di altri oggetti nel database, si potrebbero ottenere risultati imprevisti.

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

OBJECT_ID può anche essere utilizzato con altri “vincoli” come vincoli di chiave esterna o vincoli di chiave primaria, ecc. Per risultati ottimali, includere sempre il tipo di object appropriato come secondo parametro per la funzione OBJECT_ID:

Tipi di object vincolo:

  • C = vincolo CHECK
  • D = DEFAULT (vincolo o stand-alone)
  • F = vincolo FOREIGN KEY
  • PK = vincolo PRIMARY KEY
  • R = Regola (vecchio stile, stand-alone)
  • UQ = vincolo UNIQUE

Si noti inoltre che lo schema è spesso richiesto. Lo schema dei vincoli generalmente prende lo schema della tabella genitore.

L’impossibilità di inserire tra parentesi i propri vincoli (o qualsiasi cosa si stia verificando) tra parentesi quando si utilizza questo metodo può anche causare un falso negativo – se l’object utilizza caratteri insoliti (come a.), Le parentesi sono obbligatorie.

Se stai cercando un altro tipo di vincolo, ad es. Valori predefiniti, dovresti utilizzare una query diversa (Da Come trovo un vincolo predefinito utilizzando INFORMATION_SCHEMA? Risposta da devio ). Uso:

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

trovare un vincolo predefinito per nome.

Ho messo insieme diversi controlli “IF not Exists” nel mio post ” DDL ‘SE non esiste” per rendere gli script SQL ri-eseguibili ”

 IF (OBJECT_ID('FK_ChannelPlayerSkins_Channels') IS NOT NULL) 

Stai guardando qualcosa di simile, di seguito è testato in 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]') 

Solo qualcosa a cui prestare attenzione ……

In SQL Server 2008 R2 SSMS, il comando “Script Constraint as -> DROP And CREATE To” produce T-SQL come di seguito

 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 

Fuori dallo schema, questo script NON elimina il vincolo perché SELECT restituisce 0 righe. (vedi post Microsoft Connect ).

Il nome del vincolo predefinito è errato ma ritengo che abbia qualcosa a che fare con la funzione OBJECT_ID perché la modifica del nome non risolve il problema.

Per risolvere questo problema, ho rimosso l’utilizzo di OBJECT_ID e ho usato il nome del vincolo predefinito.

 (SELECT * FROM dbo.sysobjects WHERE [name] = (N'DEF_Detail_IsDeleted') AND type = 'D') 

Io uso la seguente query per verificare la presenza di un vincolo esistente prima di crearlo.

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

Questa query per il vincolo in base al nome ha come target un determinato nome di tabella. Spero che questo ti aiuti.

 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 

INFORMATION_SCHEMA è tuo amico. Ha tutti i tipi di viste che mostrano tutti i tipi di informazioni sullo schema. Controlla le tue viste di sistema. Scoprirai di avere tre viste che trattano dei vincoli, uno dei quali è CHECK_CONSTRAINTS.

Lo uso per verificare e vincoli remoti su una colonna. Dovrebbe avere tutto ciò di cui hai bisogno.

 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 [email protected]_TableName AND [email protected]_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 
 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 
 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 

Puoi usare quello sopra con un avvertimento:

 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 

È necessario utilizzare il name = [Constraint name] poiché una tabella può avere più chiavi esterne e non avere ancora la chiave esterna controllata per