ver una tabla restricciones restriccion primary name exist constraint check sql-server information-schema system-tables

sql-server - una - restricciones unique sql server



¿Cómo verificar si existe una restricción en el servidor SQL? (13)

¿Está viendo algo como esto, a continuación se prueba en 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]'')

Tengo este sql

ALTER TABLE dbo.ChannelPlayerSkins DROP CONSTRAINT FK_ChannelPlayerSkins_Channels

pero aparentemente, en algunas otras bases de datos que usamos, la restricción tiene un nombre diferente. ¿Cómo FK_ChannelPlayerSkins_Channels si hay una restricción con el nombre FK_ChannelPlayerSkins_Channels ?


INFORMACIÓN_SCHEMA es tu amigo. Tiene todo tipo de vistas que muestran todo tipo de información de esquema. Revise las vistas de su sistema. Encontrará que tiene tres vistas relacionadas con las restricciones, una de ellas es CHECK_CONSTRAINTS.


La forma más fácil de verificar la existencia de una restricción (y luego hacer algo como eliminarla si existe) es usar la función OBJECT_ID () ...

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

OBJECT_ID se puede usar sin el segundo parámetro (''C'' solo para restricciones de verificación) y también puede funcionar, pero si su nombre de restricción coincide con el nombre de otros objetos en la base de datos, puede obtener resultados inesperados.

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

OBJECT_ID también se puede usar con otras "restricciones", como las restricciones de clave externa o las restricciones de clave principal, etc. Para obtener los mejores resultados, incluya siempre el tipo de objeto apropiado como segundo parámetro para la función OBJECT_ID:

Tipos de objetos de restricción:

  • C = restricción CHECK
  • D = POR DEFECTO (restricción o independiente)
  • F = restricción FOREIGN KEY
  • PK = restricción de CLAVE PRIMARIA
  • R = Regla (estilo antiguo, independiente)
  • UQ = restricción UNICA

También tenga en cuenta que el esquema es a menudo necesario. El esquema de restricciones generalmente toma el esquema de la tabla principal.

Si no pone sus restricciones (o lo que esté marcando) entre corchetes al usar este método, también puede causar un falso negativo: si su objeto usa caracteres inusuales (como a.), Se requieren corchetes.


Puedes usar el de arriba con una advertencia:

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

Debe usar el name = [Constraint name] ya que una tabla puede tener varias claves externas y aún así no se puede verificar la clave externa


Si está buscando otro tipo de restricción, p. Ej., Valores predeterminados, debe usar una consulta diferente (desde ¿Cómo encuentro una restricción predeterminada utilizando INFORMATION_SCHEMA? Respondida por devio ). Utilizar:

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

para encontrar una restricción por defecto por nombre.

He reunido diferentes condiciones de ''Si no existe'' verifica en mi publicación " DDL ''Si no existe" condiciones para que los scripts SQL puedan volver a ejecutarse "


Solo algo a tener en cuenta para ......

En SQL Server 2008 R2 SSMS, el comando "Restricción de secuencia de comandos como -> DROP y CREAR para" produce T-SQL como a continuación

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

Fuera de la caja, esta secuencia de comandos NO elimina la restricción porque SELECT devuelve 0 filas. (ver post Microsoft Connect ).

El nombre de la restricción predeterminada es incorrecto, pero supongo que también tiene algo que ver con la función OBJECT_ID porque cambiar el nombre no soluciona el problema.

Para solucionar este problema, eliminé el uso de OBJECT_ID y usé el nombre de restricción predeterminado en su lugar.

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


Utilizo esto para verificar y las restricciones remotas en una columna. Debe tener todo lo que necesitas.

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


Utilizo la siguiente consulta para verificar una restricción existente antes de crearla.

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

Esto consulta la restricción por nombre que se dirige a un nombre de tabla dado. Espero que esto ayude.


prueba esto:

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

- EDITAR -

Cuando contesté originalmente esta pregunta, estaba pensando en "Clave externa" porque la pregunta original preguntaba acerca de cómo encontrar "FK_ChannelPlayerSkins_Channels". Desde entonces, muchas personas han comentado sobre encontrar otras "restricciones" aquí hay algunas otras consultas para eso:

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

aquí hay un método 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''

Si necesita aún más información sobre restricciones, consulte el procedimiento almacenado del sistema master.sys.sp_helpconstraint para ver cómo obtener cierta información. Para ver el código fuente utilizando SQL Server Management Studio, acceda al "Explorador de objetos". Desde allí, expandirá la base de datos "Maestra", luego expandirá "Programabilidad", luego "Procedimientos almacenados" y luego "Procedimientos almacenados del sistema". Luego puede encontrar "sys.sp_helpconstraint" y hacer clic con el botón derecho y seleccionar "modificar". Sólo tenga cuidado de no guardar ningún cambio en él. Además, puede usar este procedimiento almacenado del sistema en cualquier tabla si lo usa como EXEC sp_helpconstraint YourTableNameHere .


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


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


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


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