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

Como habilitar todas as restrições de verificação e chave estrangeira em um banco de dados no SQL Server (exemplos de T-SQL)


Você pode usar o código abaixo para habilitar todos os CHECK e restrições de chave estrangeira para o banco de dados atual no SQL Server.

Quando você habilita um CHECK ou restrição de chave estrangeira, você tem a opção de verificar os dados existentes na tabela antes que a restrição seja habilitada. Isso permite verificar se algum existente viola ou não a restrição. Para realizar esta verificação, use WITH CHECK dentro do código, caso contrário use WITH NOCHECK .


Código de amostra


Veja como habilitar todos os CHECK e restrições de chave estrangeira em um banco de dados. O primeiro exemplo verifica os dados existentes, o segundo não.

Com cheque (recomendado):
EXEC sp_MSforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT ALL"

Sem cheque:
EXEC sp_MSforeachtable "ALTER TABLE ? WITH NOCHECK CHECK CONSTRAINT ALL"

Você também pode fornecer explicitamente o nome do argumento (@command1 ) se preferir (você obterá o mesmo resultado de qualquer maneira).

Com cheque:
EXEC sp_MSforeachtable @command1="ALTER TABLE ? WITH CHECK CHECK CONSTRAINT ALL"

Sem cheque:
EXEC sp_MSforeachtable @command1="ALTER TABLE ? WITH CHECK CHECK CONSTRAINT ALL"

Esses exemplos usam o (não documentado) sp_MSforeachtable procedimento armazenado. Este procedimento permite que você execute tarefas em cada tabela em um banco de dados. Portanto, é perfeito para nossa tarefa aqui - habilitar todos os CHECK e restrições de chave estrangeira no 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        | 1             | 1                |
| ConstraintTest | chkValidEndDate | 1             | 1                |
| ConstraintTest | chkTeamSize     | 1             | 1                |
| Occupation     | chkJobTitle     | 1             | 1                |
+----------------+-----------------+---------------+------------------+

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

Podemos ver que todas as restrições estão desabilitadas, porque is_disabled está definido como 1 .

Além disso, eles não são confiáveis, porque is_not_trusted também está definido como 1 .

Exemplo 2 – Habilite as Restrições usando WITH CHECK


Agora vou habilitar todas as restrições usando o WITH CHECK argumento:
EXEC sp_MSforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT ALL"

É sempre uma boa ideia garantir que você esteja usando o banco de dados correto ao fazer esse tipo de coisa. Assim, poderíamos modificar o código primeiro alternando para o banco de dados correto:
USE Test;
EXEC sp_MSforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT ALL"

Neste caso, mudo para um banco de dados chamado Test antes de executar o procedimento armazenado.

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        | 0             | 0                |
| ConstraintTest | chkValidEndDate | 0             | 0                |
| ConstraintTest | chkTeamSize     | 0             | 0                |
| Occupation     | chkJobTitle     | 0             | 0                |
+----------------+-----------------+---------------+------------------+

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

Também podemos ver que o is_not_trusted coluna também está definida como 0 . Isso significa que a restrição é confiável. É confiável, porque conseguimos verificar todos os dados existentes antes de ser ativado.

Se eu tivesse usado WITH NOCHECK , as restrições permaneceriam não confiáveis ​​(ou seja, suas is_not_trusted sinalizador seria definido como 1 ). Isso ocorre porque o banco de dados pode conter dados que violam uma (ou mais) das restrições (dados inválidos podem ter entrado no banco de dados enquanto as restrições foram desabilitadas).

Em raras ocasiões, pode ser necessário manter dados inválidos no banco de dados. Nesses casos, a restrição precisará permanecer não confiável, porque os dados existentes não passariam na verificação inicial e, portanto, a restrição não poderá ser habilitada a menos que use WITH NOCHECK .

Consulte O que você deve saber sobre WITH NOCHECK ao habilitar uma restrição CHECK no SQL Server para obter um exemplo detalhado de alternar entre confiável e não confiável ao desabilitar e reabilitar uma restrição.

Ative as restrições individualmente


Se você deseja habilitar apenas as restrições uma a uma, consulte Como habilitar uma restrição CHECK no SQL Server e Como habilitar uma chave estrangeira no SQL Server.