Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como desabilitar todas as restrições CHECK e de chave estrangeira em um banco de dados no SQL Server (Exemplos de T-SQL)


Você pode usar o código abaixo para desativar todos os CHECK e restrições de chave estrangeira para o banco de dados atual no SQL Server.
EXEC sp_MSforeachtable @command1="ALTER TABLE ? NOCHECK CONSTRAINT ALL"

Isso usa o sp_MSforeachtable não documentado da Microsoft procedimento armazenado. Este procedimento permite que você execute tarefas em cada tabela em um banco de dados. Portanto, é perfeito para nossa tarefa aqui - desativar todos os CHECK restrições dentro do banco de dados atual.

Abaixo está um exemplo onde eu faço isso e depois verifico o resultado.


Exemplo 1 – Revise as restrições


Primeiro, darei uma olhada rápida no CHECK atual e restrições de chave estrangeira no banco de dados, para ver se estão ou não habilitadas ou desabilitadas.
SELECT
  OBJECT_NAME(parent_object_id) AS 'Table',
  name AS 'Constraint',
  is_disabled, 
  is_not_trusted
FROM sys.foreign_keys
UNION
SELECT 
  OBJECT_NAME(parent_object_id),
  name,
  is_disabled, 
  is_not_trusted
FROM sys.check_constraints;

Resultado:
+----------------+-----------------+---------------+------------------+
| Table          | Constraint      | is_disabled   | is_not_trusted   |
|----------------+-----------------+---------------+------------------|
| ConstraintTest | chkPrice        | 0             | 0                |
| ConstraintTest | chkValidEndDate | 0             | 0                |
| ConstraintTest | chkTeamSize     | 0             | 0                |
| Occupation     | chkJobTitle     | 0             | 0                |
+----------------+-----------------+---------------+------------------+

Portanto, existem atualmente quatro CHECK restrições no banco de dados, para duas tabelas diferentes.

Podemos ver que todas as restrições estão habilitadas porque is_disabled está definido como 0 .

Exemplo 2 – Desabilitar as Restrições


Agora vou desabilitar todas as restrições:
EXEC sp_MSforeachtable @command1="ALTER TABLE ? NOCHECK CONSTRAINT ALL"

Geralmente, é uma boa ideia certificar-se de que você está usando o banco de dados correto ao fazer coisas como essa. Assim, poderíamos adicionar ao código acima mudando explicitamente para o banco de dados correto:
USE Test;
EXEC sp_MSforeachtable @command1="ALTER TABLE ? NOCHECK CONSTRAINT ALL"

Neste caso, mudo para um banco de dados chamado Test .

Exemplo 3 – Verifique o resultado


Tendo executado o código acima, agora executarei a mesma consulta do primeiro exemplo para ver o resultado.
SELECT
  OBJECT_NAME(parent_object_id) AS 'Table',
  name AS 'Constraint',
  is_disabled, 
  is_not_trusted
FROM sys.foreign_keys
UNION
SELECT 
  OBJECT_NAME(parent_object_id),
  name,
  is_disabled, 
  is_not_trusted
FROM sys.check_constraints;

Resultado:
+----------------+-----------------+---------------+------------------+
| Table          | Constraint      | is_disabled   | is_not_trusted   |
|----------------+-----------------+---------------+------------------|
| ConstraintTest | chkPrice        | 1             | 1                |
| ConstraintTest | chkValidEndDate | 1             | 1                |
| ConstraintTest | chkTeamSize     | 1             | 1                |
| Occupation     | chkJobTitle     | 1             | 1                |
+----------------+-----------------+---------------+------------------+

Portanto, todas as restrições no banco de dados foram desabilitadas (porque o is_disabled coluna está definida como 1 para essas restrições).

Observe que o is_not_trusted coluna também está definida como 1 . Essa é uma consideração importante, especialmente se você pretende reativar qualquer uma de suas restrições desabilitadas.

Consulte O que você deve saber sobre WITH NOCHECK ao habilitar uma restrição CHECK no SQL Server para obter informações sobre como restaurar a confiança ao reativar suas restrições. As informações nesse artigo também se aplicam a chaves estrangeiras.

Desabilitar as restrições individualmente


Se você quiser apenas desabilitar as restrições uma a uma, consulte Como desabilitar uma restrição CHECK no SQL Server para obter exemplos.