如何检查一个约束存在于Sql服务器?

我有这个SQL:

ALTER TABLE dbo.ChannelPlayerSkins DROP CONSTRAINT FK_ChannelPlayerSkins_Channels 

但显然,在我们使用的其他一些数据库上,这个约束有一个不同的名字。 如何检查名称为FK_ChannelPlayerSkins_Channels的约束。

尝试这个:

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

– 编辑 –

当我回答这个问题的时候,我之所以会想到“外键”,是因为原来的问题是关于寻找“FK_ChannelPlayerSkins_Channels”的问题。 从那时起,很多人就发现其他“约束”发表了评论,这里还有一些其他的疑问:

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

这是另一种方法

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

如果您需要更多的约束信息,请查看系统存储过程master.sys.sp_helpconstraint以查看如何获取某些信息。 使用SQL Server Management Studio查看源代码进入“对象浏览器”。 从那里展开“Master”数据库,然后展开“Programmability”,然后展开“Stored Procedures”,然后展开“System Stored Procedures”。 然后您可以find“sys.sp_helpconstraint”并右键单击它并select“修改”。 只是要小心,不要保存任何更改。 另外,你可以像使用EXEC sp_helpconstraint YourTableNameHere一样在任何表上使用这个系统存储过程。

检查约束是否存在的最简单的方法是使用OBJECT_ID()函数。

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

OBJECT_ID可以在没有第二个参数的情况下使用(仅限于检查约束的“C”),也可以使用OBJECT_ID,但是如果约束名称与数据库中其他对象的名称匹配,则可能会得到意外的结果。

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

OBJECT_ID还可以与其他“约束”一起使用,如“外键约束”或“主键约束”等。为了获得最佳结果,始终包含适当的对象types作为OBJECT_ID函数的第二个参数:

约束对象types:

  • C = CHECK约束
  • D = DEFAULT(约束或独立)
  • F = FOREIGN KEY约束
  • PK = PRIMARY KEY约束
  • R =规则(旧式,独立式)
  • UQ = UNIQUE约束

另外请注意,模式通常是必需的。 约束模式通常采用父表的模式。

如果你的对象使用了不寻常的字符(如。),那么在使用这个方法的时候,不要把你的约束(或者你正在检查的任何东西)放在方括号中,这也可能导致错误的否定。

如果你正在寻找其他types的约束,例如默认值,你应该使用不同的查询(从如何find使用INFORMATION_SCHEMA的默认约束?由devio回答)。 使用:

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

按名称查找默认约束。

我已经在我的post“ DDL”IF不存在“条件中放入了不同的”如果不存在“检查, 以使SQL脚本可以重新运行”

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

你在看这样的东西,下面是在SQL Server 2005中testing

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

只是要注意……

在SQL Server 2008 R2 SSMS中,“Script Constraint as – > DROP And CREATE To”命令产生如下的T-SQL

 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 

开箱即用,这个脚本不会删除约束,因为SELECT返回0行。 (请参阅发布Microsoft Connect )。

默认约束的名称是错误的,但是我收集它也与OBJECT_ID函数有关,因为更改名称不能解决问题。

为了解决这个问题,我删除了OBJECT_ID的用法,并使用了默认的约束名称。

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

在创build之前,我使用以下查询来检查现有约束。

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

这将通过名称来查询给定表名称的约束。 希望这可以帮助。

 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是你的朋友。 它具有各种视图显示各种模式信息。 检查你的系统视图。 你会发现你有三个处理约束的视图,一个是CHECK_CONSTRAINTS。

我用这个来检查列和远程约束。 它应该有你需要的一切。

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

您可以使用上面的一个警告:IF EXISTS(SELECT 1 FROM sys.foreign_keys WHERE parent_object_id = OBJECT_ID(N'dbo.TableName')和name ='CONSTRAINTNAME')BEGIN ALTER TABLE TableName DROP CONSTRAINT CONSTRAINTNAME END

需要使用名称= [约束名称],因为表可能有多个外键,仍然没有检查外键