sql-server - studio - sql server localhost




Como verificar se existe uma restrição no servidor SQL? (9)

A maneira mais fácil de verificar a existência de uma restrição (e, em seguida, fazer algo como soltá-lo, 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 nome da 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 chaves primárias, etc. Para obter melhores resultados, inclua sempre o tipo de objeto apropriado como o segundo parâmetro para a função OBJECT_ID:

Tipos de objeto de restrição:

  • C = restrição CHECK
  • D = PADRÃO (restrição ou autônomo)
  • F = restrição FOREIGN KEY
  • PK = restrição PRIMARY KEY
  • R = Regra (estilo antigo, autônomo)
  • UQ = restrição UNIQUE

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

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

Eu tenho esse 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 existe uma restrição com o nome FK_ChannelPlayerSkins_Channels .


Apenas algo para assistir ......

No SSMS do SQL Server 2008 R2, o comando "Restrição de Script como -> DROP E CRIAR para" produz o 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 solta a restrição porque o SELECT retorna 0 linhas. (veja após o Microsoft Connect ).

O nome da restrição padrão está errado, mas acho que também tem algo a ver com a função OBJECT_ID, porque mudar o nome não resolve o problema.

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

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

Eu uso isso para verificar e restrições remotas em uma coluna. Deve ter tudo 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[email protected]ps_TableName
        AND tc.name[email protected]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


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] pois uma tabela pode ter várias chaves estrangeiras e ainda não ter a chave estrangeira sendo verificada


tente isso:

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

- EDIT -

Quando eu originalmente respondi a esta pergunta, eu estava pensando em "Foreign Key" porque a pergunta original perguntava sobre encontrar "FK_ChannelPlayerSkins_Channels". Desde então, muitas pessoas comentaram sobre encontrar outras "restrições", aqui estão algumas outras perguntas 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, procure dentro do procedimento armazenado do sistema master.sys.sp_helpconstraint para ver como obter determinadas 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", depois expande "Programabilidade", depois "Procedimentos Armazenados" e, em seguida, "Procedimentos Armazenados do Sistema". Você pode então encontrar "sys.sp_helpconstraint" e clicar com o botão direito e selecionar "modificar". Apenas tome 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 .


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'))
 BEGIN 
ALTER TABLE TableName DROP CONSTRAINT CONSTRAINTNAME 
END 

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                




system-tables