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
Se você está procurando outro tipo de restrição, por exemplo, padrões, você deve usar uma consulta diferente (De Como eu encontro uma restrição padrão usando INFORMATION_SCHEMA? Respondida por devio ). Usar:
SELECT * FROM sys.objects WHERE type = 'D' AND name = @name
para encontrar uma restrição padrão pelo nome.
Eu montei diferentes verificações 'IF not Exists' em meu post " DDL 'IF não existe" condições para tornar scripts SQL re-runnable "
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