¿Cómo comprobar si existe una restricción en el servidor SQL?
-
21-09-2019 - |
Pregunta
Tengo este SQL:
ALTER TABLE dbo.ChannelPlayerSkins
DROP CONSTRAINT FK_ChannelPlayerSkins_Channels
pero al parecer, en algunas otras bases de datos que utilizamos, la restricción tiene un nombre diferente. ¿Cómo puedo comprobar si hay una restricción con el nombre FK_ChannelPlayerSkins_Channels
.
Solución
intente lo siguiente:
SELECT
*
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS
WHERE CONSTRAINT_NAME ='FK_ChannelPlayerSkins_Channels'
- Editar -
Cuando inicialmente respondieron a esta pregunta, yo estaba pensando "clave externa" porque la pregunta original preguntó sobre la búsqueda de "FK_ChannelPlayerSkins_Channels". Desde entonces, muchas personas han comentado en la búsqueda de otras "restricciones" aquí hay algunas otras consultas para que:
--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í es 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 información aún más limitación, mirada dentro del sistema almacenada master.sys.sp_helpconstraint
procedimiento para ver cómo conseguir cierta información. Para ver el código fuente utilizando SQL Server Management Studio entrar en el "Explorador de objetos". Desde allí se expande la base de datos "Maestro", a continuación, expanda "Programación", "Procedimientos almacenados", entonces, "Procedimientos almacenados del sistema" a continuación. A continuación, puede encontrar "sys.sp_helpconstraint" y haga clic derecho y seleccione "modificar". Sólo tenga cuidado de no guardar los cambios a la misma. Además, sólo puede utilizar este procedimiento almacenado del sistema en cualquier mesa usándolo como EXEC sp_helpconstraint YourTableNameHere
.
Otros consejos
La manera más fácil para comprobar la existencia de una restricción (y luego hacer algo como la gota que 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 utilizar sin el segundo parámetro ( 'C' para sólo restricciones de comprobación) y que también pueden trabajar, pero si su nombre de restricción coincide con el nombre de otros objetos en la base de datos que 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 utilizar con otros "limitaciones", tales como restricciones de clave externa o restricciones de clave principal, etc. Para obtener los mejores resultados, siempre incluir el tipo de objeto adecuado como el segundo parámetro para la función de OBJECT_ID:
Tipos de objetos restricción:
- C = restricción CHECK
- D = DEFAULT (restricción o independiente)
- F = restricción de clave externa
- PK = CLAVE restricción PRIMARY
- R = Regla (al estilo antiguo, stand-alone)
- UQ = restricción UNIQUE
Tenga en cuenta también que a menudo se requiere el esquema. El esquema de restricciones generalmente toma el esquema de la tabla primaria.
También puede causar un falso negativo No depositar sus limitaciones (o lo que sea que usted está mirando) entre corchetes cuando se utiliza este método - (. Tales como: a) si su objeto utiliza caracteres inusuales, son necesarios los soportes.
Si usted está buscando otro tipo de restricción, por ejemplo, por defecto, se deben utilizar consulta diferente (De ¿Cómo encuentro un defecto restricción de uso de INFORMATION_SCHEMA? contestada por DEVIO ). Uso:
SELECT * FROM sys.objects WHERE type = 'D' AND name = @name
para encontrar una restricción predeterminada por su nombre.
IF (OBJECT_ID('FK_ChannelPlayerSkins_Channels') IS NOT NULL)
¿Usted está mirando 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]')
Sólo es algo a tener en cuenta ......
En SQL Server 2008 R2 SSMS, la "escritura como restricción -> DROP y CREATE A" comando 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, este script no baja la restricción debido a que el SELECT devuelve 0 filas. (Ver post Microsoft Connect ).
El nombre de la restricción por defecto está mal, pero tengo entendido que también tiene algo que ver con la función OBJECT_ID porque al cambiar el nombre no se soluciona el problema.
Para solucionar esto, I elimina el uso de OBJECT_ID y se utiliza el nombre de restricción predeterminado.
(SELECT * FROM dbo.sysobjects WHERE [name] = (N'DEF_Detail_IsDeleted') AND type = 'D')
Yo uso la siguiente consulta para comprobar si existe una restricción existente antes de que yo creo.
IF (NOT EXISTS(SELECT 1 FROM sysconstraints WHERE OBJECT_NAME(constid) = 'UX_CONSTRAINT_NAME' AND OBJECT_NAME(id) = 'TABLE_NAME')) BEGIN
...
END
Este consultas para la restricción por su nombre dirigidas a un nombre de la tabla dada. Espero que esto ayude.
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
INFORMATION_SCHEMA
es su amigo. Cuenta con todo tipo de vistas que muestran todo tipo de información de esquema. Compruebe las vistas del sistema. Usted encontrará que tiene tres puntos de vista frente a las limitaciones, un ser CHECK_CONSTRAINTS
.
Lo utilizo para comprobar si hay restricciones y remotas en una columna. Debe tener todo lo que necesita.
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
Se puede utilizar la 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
necesidad de utilizar el name = [Constraint name]
ya que una tabla puede tener varias claves externas y todavía no tienen la clave externa que se comprueba para