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

Como desabilitar uma restrição CHECK no SQL Server (Exemplos de T-SQL)


Quando você tenta inserir dados em uma tabela que tem um CHECK totalmente habilitado restrição, você só terá sucesso se os dados não violarem essa restrição. Se você tentar inserir dados inválidos, a operação falhará com um erro.

Mas e se você se encontrar na situação em que realmente deve inserir dados que violarão o CHECK limitação? Talvez a restrição não se aplique mais, ou talvez você tenha uma exceção em que uma linha tenha permissão para ignorar a restrição. De qualquer forma, você não poderá inserir nada fora das regras da restrição.

Se você se encontrar nessa situação, sempre poderá desativar a restrição. Veja como fazer isso usando o Transact-SQL.


Exemplo 1 – Desabilitar a restrição CHECK


Para desabilitar um CHECK restrição, use o NOCHECK argumento dentro de um ALTER TABLE demonstração.

Assim:
ALTER TABLE Occupation  
NOCHECK CONSTRAINT chkJobTitle; 

Este código desabilita uma restrição chamada chkJobTitle .

Exemplo 2 – Revise a restrição CHECK


Podemos consultar as sys.check_constraints visão do sistema para verificar se nossa restrição foi desabilitada:
SELECT 
  name,
  is_disabled,
  is_not_trusted,
  definition
FROM sys.check_constraints;

Resultado:
+-----------------+---------------+------------------+----------------------------------------+
| name            | is_disabled   | is_not_trusted   | definition                             |
|-----------------+---------------+------------------+----------------------------------------|
| chkPrice        | 0             | 0                | ([Price]>(0))                          |
| chkValidEndDate | 0             | 0                | ([EndDate]>=[StartDate])               |
| chkTeamSize     | 0             | 0                | ([TeamSize]>=(5) AND [TeamSize]<=(20)) |
| chkJobTitle     | 1             | 1                | ([JobTitle]<>'Digital Nomad')          |
+-----------------+---------------+------------------+----------------------------------------+

Neste caso eu selecionei todos os CHECK restrições do banco de dados atual.

Podemos ver que este é o único que está desabilitado (porque seu is_disabled coluna está definida como 1 ).

Você pode notar que o is_not_trusted coluna também está definida como 1 . Isso indica que o CHECK restrição não foi verificada pelo sistema para todas as linhas.

Em outras palavras, não podemos mais assumir que a restrição verificou todos os dados. O fato de a restrição estar desabilitada significa que os dados agora podem entrar no banco de dados sem serem verificados pela restrição. Portanto, existe a possibilidade de dados inválidos estarem presentes no banco de dados.

Se você precisar reativar o CHECK restrição, você terá a oportunidade de restaurar a confiança da restrição (usando o WITH CHECK opção). Isso verificará todas as linhas existentes antes de ativar a restrição.

Você também terá a opção de não verificar os dados existentes, mas isso só deve ser feito em casos raros.

Consulte O que você deve saber sobre WITH NOCHECK ao habilitar uma restrição CHECK no SQL Server para obter uma demonstração de como a confiança é afetada, dependendo de como você reativa a restrição.