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.

¿Fue útil?

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.

He reunido diferente 'si no existe" cheques en mi post '

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

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top