Pergunta

Eu tenho este SQL:

ALTER TABLE dbo.ChannelPlayerSkins
    DROP CONSTRAINT FK_ChannelPlayerSkins_Channels

Mas, aparentemente, em alguns outros bancos de dados que usamos, a restrição tem um nome diferente. Como faço para verificar se há uma restrição com o nome FK_ChannelPlayerSkins_Channels.

Foi útil?

Solução

Experimente isso:

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

-Editar-

Quando eu originalmente respondi a essa pergunta, estava pensando "chave estrangeira" porque a pergunta original fez sobre a descoberta de "fk_channelplayerskins_channels". Desde então, muitas pessoas comentaram sobre encontrar outras "restrições". Aqui estão algumas outras consultas para isso:

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

Aqui está um 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'

Se você precisar de mais informações de restrição, olhe dentro do procedimento armazenado do sistema master.sys.sp_helpconstraint para ver como obter certas informações. Para visualizar o código -fonte usando o SQL Server Management Studio, entre no "Object Explorer". A partir daí, você expande o banco de dados "mestre" e expande a "programação" e, em seguida, "procedimentos armazenados" e "procedimentos armazenados do sistema". Em seguida, você pode encontrar "sys.sp_helpconstrain" e clique com o botão direito do mouse e selecione "Modificar". Apenas tenha cuidado para não salvar nenhuma alteração. Além disso, você pode simplesmente usar este procedimento armazenado do sistema em qualquer tabela usando -o como EXEC sp_helpconstraint YourTableNameHere.

Outras dicas

Maneira mais fácil de verificar a existência de uma restrição (e depois fazer algo como soltar se existir) é usar a função object_id () ...

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

Object_id pode ser usado sem o segundo parâmetro ('C' apenas para restrições de verificação) e isso também pode funcionar, mas se o seu nome de restrição corresponder ao nome de outros objetos no banco de dados, você poderá obter resultados inesperados.

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

Object_id também pode ser usado com outras "restrições", como restrições de chave estrangeira ou restrições de chave primária, etc. Para obter melhores resultados, sempre inclua o tipo de objeto apropriado como o segundo parâmetro para a função Object_Id:

Tipos de objetos de restrição:

  • C = Verifique a restrição
  • D = padrão (restrição ou independência)
  • F = restrição de chave estrangeira
  • PK = restrição de chave primária
  • R = regra (estilo antigo, independente)
  • Uq = restrição única

Observe também que o esquema é frequentemente necessário. O esquema das restrições geralmente leva o esquema da tabela pai.

Falha em colocar suas restrições (ou o que quer que você esteja verificando) entre colchetes ao usar esse método também pode causar um falso negativo - se seu objeto usar caracteres incomuns (como a.), Os suportes são necessários.

Se você estiver procurando por outro tipo de restrição, por exemplo, padrões, você deve usar uma consulta diferente (de Como encontro uma restrição padrão usando Information_schema? respondido por Devio). Usar:

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

Para encontrar uma restrição padrão pelo nome.

Eu reuni diferentes verificações 'se não existe "no meu post"DDL ', se não existe "condições para tornar os scripts SQL rennable"

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

Você está olhando para algo assim, abaixo é testado no 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]')

Apenas algo a observar ......

No SQL Server 2008 R2 SSMS, a restrição de script como -> soltar e criar para "o comando produz t -sql como abaixo

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

Fora da caixa, este script não retém a restrição porque a seleção retorna 0 linhas. (Veja Post Microsoft Connect).

O nome da restrição padrão está errado, mas eu o concluo também tem algo a ver com a função object_id porque alterar o nome não corrige o problema.

Para corrigir isso, removi o uso do Object_ID e usei o nome de restrição padrão.

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

Eu uso a consulta a seguir para verificar uma restrição existente antes de criá -la.

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

Esta consulta para a restrição pelo nome direcionada a um determinado nome da tabela. Espero que isto ajude.

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 é seu amigo. Tem todos os tipos de visualizações que mostram todos os tipos de informações sobre esquema. Verifique as visualizações do seu sistema. Você descobrirá que tem três visualizações que lidam com restrições, uma sendo CHECK_CONSTRAINTS.

Eu uso isso para verificar e restrições remotas em uma coluna. Deve ter tudo o que você precisa.

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                

Você pode usar o acima com uma ressalva:

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 

Precisa usar o name = [Constraint name] Como uma tabela pode ter várias chaves estrangeiras e ainda não ter a chave estrangeira sendo verificada

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top