Um importante passo, que faz parte do projeto de um banco de dados, é decidir a melhor maneira de como forçar e garantir a integridade dos dados. A integridade pode ser forçada completa e unicamente na camada de aplicação, ou exclusivamente no nível da camada de dados (leia-se banco de dados), ou, ainda, através de uma abordagem híbrida (esta é a abordagem mais comumente utilizada). Discussões e polêmicas à parte, existe um mínimo de “coisas” que você deveria implementar na camada de banco, visando garantir a integridade. Iremos falar sobre isso no decorrer deste post.

 

TIPOS DE INTEGRIDADE DE DADOS

Conceitualmente existem três tipos de integridade de dados, conforme ilustra a figura abaixo.

· Integridade de domínio (coluna): especifica o conjunto de valores válidos para uma determinada coluna, bem como se a coluna aceita nulo ou não.

· Integridade de entidade (linha): requer que cada linha seja identificada de forma única na tabela, ou seja, cada linha possui uma identificação exclusiva. Isto é normalmente chamado de chave primária (primary key).

· Integridade referencial (entre tabelas): mantém um relacionamento consistente entre a Tabela A e a Tabela B. A chave primária da Tabela A existe como uma coluna na Tabela B, onde é conceitualmente chamada de chave-estrangeira. Desta forma, não será possível inserir um valor na coluna chave-estrangeira da Tabela B que não exista na coluna chave-primária da Tabela A. Por exemplo, não será possível inserir na tabela de Vendas o código de um cliente que não exista na tabela de Clientes.

Dentro do SQL Server temos as seguintes opções para forçar e garantir a integridade de dados:

Tipo de dados Define o tipo de dados que a coluna pode armazenar. Exemplo: DATETIME2
Nulidade Determina se ou não um valor deve estar presente em uma coluna
Constraints Define regras que limitam o conjunto de valores que podem ser armazenados em uma coluna ou, no nível da tabela, como os valores em diferentes colunas estão relacionados
Triggers Define um código que é executado automaticamente quando uma tabela é modificada. Através disso podemos aplicar restrições de valores e, inclusive, regras de negócio, dentre outras coisas.

Nulidade de Coluna (NULL / NOT NULL)

Este mecanismo permite forçar a integridade de domínio. Ele define se uma coluna é obrigatória. Existem muitas bases de dados legadas por aí cuja questão da nulidade fica completamente a cargo da aplicação, enquanto que nas tabelas todas as colunas estão setadas para aceitar nulo. Este tipo de design é um risco!

Vejamos como implementar a nulidade em tabelas utilizando as opções NULL e NOT NULL. Neste ponto estou destruindo e recriando o banco DBExame70461.

[et_pb_dmb_code_snippet _builder_version=”4.0.6″ code=”dXNlIG1hc3RlcgpHTwoKaWYgZGJfaWQoJ0RCRXhhbWU3MDQ2MScpIElTIE5PVCBOVUxMCkJFR0lOCiAgICBhbHRlciBkYXRhYmFzZSBEQkV4YW1lNzA0NjEgc2V0IHNpbmdsZV91c2VyIHdpdGggcm9sbGJhY2sgaW1tZWRpYXRlOwogICAgZHJvcCBEQVRBQkFTRSBEQkV4YW1lNzA0NjE7CkVORDsKCkNSRUFURSBEQVRBQkFTRSBEQkV4YW1lNzA0NjE7CkdPCgpVU0UgREJFeGFtZTcwNDYxOwpHTwoKQ1JFQVRFIFRBQkxFIGRiby5Qcm9kdXRvCiggICAgSWQgSU5UIFBSSU1BUlkgS0VZLAogICAgTnVtZXJvIElOVCwKICAgIE5vbWUgVkFSQ0hBUig1MCkgTk9UIE5VTEwsCiAgICBEZXNjcmljYW8gVkFSQ0hBUig1MDApIE5VTEwKKTsKSU5TRVJUIGRiby5Qcm9kdXRvIChJZCwgTm9tZSkgVkFMVUVTICgxLCAnTWVsYW5jaWEnKTs=” hover_enabled=”0″]dXNlIG1hc3RlcgpHTwoKaWYgZGJfaWQoJ0RCRXhhbWU3MDQ2MScpIElTIE5PVCBOVUxMCkJFR0lOCiAgICBhbHRlciBkYXRhYmFzZSBEQkV4YW1lNzA0NjEgc2V0IHNpbmdsZV91c2VyIHdpdGggcm9sbGJhY2sgaW1tZWRpYXRlOwogICAgZHJvcCBEQVRBQkFTRSBEQkV4YW1lNzA0NjE7CkVORDsKCkNSRUFURSBEQVRBQkFTRSBEQkV4YW1lNzA0NjE7CkdPCgpVU0UgREJFeGFtZTcwNDYxOwpHTwoKQ1JFQVRFIFRBQkxFIGRiby5Qcm9kdXRvCiggICAgSWQgSU5UIFBSSU1BUlkgS0VZLAogICAgTnVtZXJvIElOVCwKICAgIE5vbWUgVkFSQ0hBUig1MCkgTk9UIE5VTEwsCiAgICBEZXNjcmljYW8gVkFSQ0hBUig1MDApIE5VTEwKKTsKSU5TRVJUIGRiby5Qcm9kdXRvIChJZCwgTm9tZSkgVkFMVUVTICgxLCAnTWVsYW5jaWEnKTs=[/et_pb_dmb_code_snippet]

Explicitamente defini a coluna NOME como obrigatória e a coluna DESCRICAO como opcional. E a coluna NUMERO, é obrigatória? Por padrão quando não explicitamos NULL ou NOT NULL a coluna será nulável. E a coluna ID? Neste caso, a coluna foi definida como chave-primária e, por consequência, ela será implicitamente criada como NOT NULL. Por fim, na instrução INSERT eu especifiquei apenas as colunas não nuláveis (obrigatórias).

Nulo não é valor, pelo contrário, nulo indica ausência de valor.

Constraints

Como já foi mencionado, constraint é um mecanismo que permite restringir o conjunto de valores para uma dada coluna ou, no nível da tabela, como os valores de diferentes colunas estão relacionados (relacionamento entre colunas da mesma tabela ou entre colunas de tabelas diferentes). Os tipos de constraints são:

Default Values (Valor Padrão) Integridade de domínio (coluna)
Check (Checagem / Verificação) Integridade de domínio (coluna)
Primary Key (chave-primária) Integridade de entidade (linha)
UNIQUE KEY (chave-única) Integridade de entidade (linha)
Foreign Key (chave-estrangeira) Integridade referencial (entre colunas ou tabelas)

DEFAULT Constraints

Este tipo de constraint fornece um valor padrão para uma coluna. Ter um valor padrão é um recurso útil nas instruções de INSERT. Vejamos abaixo.

[et_pb_dmb_code_snippet _builder_version=”4.0.6″ code=”VVNFIERCRXhhbWU3MDQ2MTsKCkRST1AgVEFCTEUgZGJvLlByb2R1dG87CgpDUkVBVEUgVEFCTEUgZGJvLlByb2R1dG8KKCAgICBJZCBJTlQgUFJJTUFSWSBLRVkgREVGQVVMVCAxLAogICAgTnVtZXJvIElOVCBERUZBVUxUIDc3LAogICAgTm9tZSBWQVJDSEFSKDUwKSBOT1QgTlVMTCBERUZBVUxUICdQcm9kdXRvIGdlcmFsJywKICAgIERlc2NyaWNhbyBWQVJDSEFSKDUwMCkgTlVMTCBERUZBVUxUICdEZXNjcmnDp8OjbyBnZXJhbCcKKTsKR08KCklOU0VSVCBkYm8uUHJvZHV0byAoSWQsIE51bWVybywgTm9tZSwgRGVzY3JpY2FvKQpWQUxVRVMgKERFRkFVTFQsIERFRkFVTFQsIERFRkFVTFQsIERFRkFVTFQpOwoKSU5TRVJUIGRiby5Qcm9kdXRvIChJZCwgTnVtZXJvLCBOb21lLCBEZXNjcmljYW8pClZBTFVFUyAoMiwgODgsICdCYXRhdGEnLCBERUZBVUxUKTsKCklOU0VSVCBkYm8uUHJvZHV0byAoSWQpClZBTFVFUyAoMyk7″ hover_enabled=”0″]VVNFIERCRXhhbWU3MDQ2MTsKCkRST1AgVEFCTEUgZGJvLlByb2R1dG87CgpDUkVBVEUgVEFCTEUgZGJvLlByb2R1dG8KKCAgICBJZCBJTlQgUFJJTUFSWSBLRVkgREVGQVVMVCAxLAogICAgTnVtZXJvIElOVCBERUZBVUxUIDc3LAogICAgTm9tZSBWQVJDSEFSKDUwKSBOT1QgTlVMTCBERUZBVUxUICdQcm9kdXRvIGdlcmFsJywKICAgIERlc2NyaWNhbyBWQVJDSEFSKDUwMCkgTlVMTCBERUZBVUxUICdEZXNjcmnDp8OjbyBnZXJhbCcKKTsKR08KCklOU0VSVCBkYm8uUHJvZHV0byAoSWQsIE51bWVybywgTm9tZSwgRGVzY3JpY2FvKQpWQUxVRVMgKERFRkFVTFQsIERFRkFVTFQsIERFRkFVTFQsIERFRkFVTFQpOwoKSU5TRVJUIGRiby5Qcm9kdXRvIChJZCwgTnVtZXJvLCBOb21lLCBEZXNjcmljYW8pClZBTFVFUyAoMiwgODgsICdCYXRhdGEnLCBERUZBVUxUKTsKCklOU0VSVCBkYm8uUHJvZHV0byAoSWQpClZBTFVFUyAoMyk7[/et_pb_dmb_code_snippet]

Note que destruí e recriei a tabela. Para criar a constraint bastou adicionar a palavra reservada DEFAULT na instrução CREATE TABLE. No comando INSERT usei a palavra DEFAULT para que seja gravado o valor padrão na respectiva coluna. Na terceira instrução INSERT eu especifiquei apenas a coluna ID, omitindo as demais. Isso é válido quando as colunas omitidas são nuláveis ou possuem constraint default.

CHECK Constraints

Este tipo de constraint limita os valores que são permitidos em uma coluna. Vamos explorar algumas possibilidades.

[et_pb_dmb_code_snippet _builder_version=”4.0.6″ code=”Q1JFQVRFIFRBQkxFIGRiby5WZW5kZWRvcmVzCiggICAgSWQgSU5UIE5PVCBOVUxMIFBSSU1BUlkgS0VZLAogICAgTm9tZSB2YXJjaGFyKDUwKSBOT1QgTlVMTCwKICAgIFNleG8gY2hhcigxKSBOVUxMIENIRUNLIChTZXhvIGluKCdNJywnRicpKSBERUZBVUxUICdNJywKICAgIENvbWlzc2FvIGludCBOT1QgTlVMTAogICAgICAgIGNvbnN0cmFpbnQgQ2tfVmVuZGVkb3Jlc19Db21pc3NhbwogICAgICAgIENIRUNLIChDb21pc3NhbyBCRVRXRUVOIDEgQU5EIDUpLAogICAgVGlwb0RlU2FsYXJpbyB2YXJjaGFyKDEwKSBOT1QgTlVMTAogICAgICAgIENIRUNLIChUaXBvRGVTYWxhcmlvIGluICgnSG9yYScsJ1NlbWFuYScsJ01lcycpKSwKICAgIFRlbGVmb25lIHZhcmNoYXIoOSkgTlVMTCBDSEVDSyAoTEVOKFRlbGVmb25lKSA+PSA4KQopOw==” hover_enabled=”0″]Q1JFQVRFIFRBQkxFIGRiby5WZW5kZWRvcmVzCiggICAgSWQgSU5UIE5PVCBOVUxMIFBSSU1BUlkgS0VZLAogICAgTm9tZSB2YXJjaGFyKDUwKSBOT1QgTlVMTCwKICAgIFNleG8gY2hhcigxKSBOVUxMIENIRUNLIChTZXhvIGluKCdNJywnRicpKSBERUZBVUxUICdNJywKICAgIENvbWlzc2FvIGludCBOT1QgTlVMTAogICAgICAgIGNvbnN0cmFpbnQgQ2tfVmVuZGVkb3Jlc19Db21pc3NhbwogICAgICAgIENIRUNLIChDb21pc3NhbyBCRVRXRUVOIDEgQU5EIDUpLAogICAgVGlwb0RlU2FsYXJpbyB2YXJjaGFyKDEwKSBOT1QgTlVMTAogICAgICAgIENIRUNLIChUaXBvRGVTYWxhcmlvIGluICgnSG9yYScsJ1NlbWFuYScsJ01lcycpKSwKICAgIFRlbGVmb25lIHZhcmNoYXIoOSkgTlVMTCBDSEVDSyAoTEVOKFRlbGVmb25lKSA+PSA4KQopOw==[/et_pb_dmb_code_snippet]

Para criar a constraint bastou utilizar a palavra reservada CHECK na instrução CREATE TABLE. Na coluna COMISSAO, de forma explícita, informei o nome para a constraint: CK_Vendedores_Comissao. O benefício de criar uma constraint check com nome customizado é a facilidade em futuras alterações usando o comando ALTER TABLE. Note que para a coluna TELEFONE foi definida uma constraint que obriga o usuário a informar um número de telefone com pelo menos oito dígitos. Perceba, ainda, que para a coluna SEXO criei duas constraints: uma CHECK e outra DEFAULT. A figura abaixo mostra como ficou a tabela após a sua criação.

Vejamos o que acontece quando se tenta inserir, por exemplo, um registro de vendedor com uma comissão maior que 5% e com um número de telefone de 3 dígitos.

[et_pb_dmb_code_snippet _builder_version=”4.0.6″ code=”LS0gVGVudGFuZG8gaW5zZXJpciByZWdpc3RybyBjb20gY29taXNzw6NvIGFjaW1hIGRlIDUlCklOU0VSVCBkYm8uVmVuZGVkb3JlcyAoSWQsIE5vbWUsIFNleG8sIENvbWlzc2FvLCBUaXBvRGVTYWxhcmlvLCBUZWxlZm9uZSkKVkFMVUVTICgxLCAnQW50b25pbyBTaWx2YScsICdNJywgNywgJ01lcycsIDEyMzQ1Njc4OSk7″ hover_enabled=”0″]LS0gVGVudGFuZG8gaW5zZXJpciByZWdpc3RybyBjb20gY29taXNzw6NvIGFjaW1hIGRlIDUlCklOU0VSVCBkYm8uVmVuZGVkb3JlcyAoSWQsIE5vbWUsIFNleG8sIENvbWlzc2FvLCBUaXBvRGVTYWxhcmlvLCBUZWxlZm9uZSkKVkFMVUVTICgxLCAnQW50b25pbyBTaWx2YScsICdNJywgNywgJ01lcycsIDEyMzQ1Njc4OSk7[/et_pb_dmb_code_snippet]
[et_pb_dmb_code_snippet _builder_version=”4.0.6″ code=”LS0gVGVudGFuZG8gaW5zZXJpciByZWdpc3RybyBjb20gdGVsZWZvbmUgZGUgMyBkw61naXRvcwpJTlNFUlQgZGJvLlZlbmRlZG9yZXMgKElkLCBOb21lLCBTZXhvLCBDb21pc3NhbywgVGlwb0RlU2FsYXJpbywgVGVsZWZvbmUpClZBTFVFUyAoMSwgJ0FudG9uaW8gU2lsdmEnLCAnTScsIDUsICdNZXMnLCAxMjMpOw==” hover_enabled=”0″]LS0gVGVudGFuZG8gaW5zZXJpciByZWdpc3RybyBjb20gdGVsZWZvbmUgZGUgMyBkw61naXRvcwpJTlNFUlQgZGJvLlZlbmRlZG9yZXMgKElkLCBOb21lLCBTZXhvLCBDb21pc3NhbywgVGlwb0RlU2FsYXJpbywgVGVsZWZvbmUpClZBTFVFUyAoMSwgJ0FudG9uaW8gU2lsdmEnLCAnTScsIDUsICdNZXMnLCAxMjMpOw==[/et_pb_dmb_code_snippet]

Agora, vamos falar de algo perigoso. Veja que definimos a coluna SEXO como nulável. Contudo, a constraint CHECK nessa coluna obriga informar apenas os valores M e F. Mas, o que acontecerá se tentarmos inserir um NULL nesta coluna? Devido ao fato da coluna aceitar NULL então a constraint não considera um NULL como falso, ou, em outras palavras, o NULL é simplesmente ignorado.

[et_pb_dmb_code_snippet _builder_version=”4.0.6″ code=”LS0gSW5zZXJpbmRvIGNvbSBzdWNlc3NvIHVtIE5VTEwgbmEgY29sdW5hIFNFWE8gCklOU0VSVCBkYm8uVmVuZGVkb3JlcyAoSWQsIE5vbWUsIFNleG8sIENvbWlzc2FvLCBUaXBvRGVTYWxhcmlvLCBUZWxlZm9uZSkKVkFMVUVTICgxLCAnQW50b25pbyBTaWx2YScsIE5VTEwsIDEsICdNZXMnLCAxMjM0NTY3ODkpOw==” hover_enabled=”0″]LS0gSW5zZXJpbmRvIGNvbSBzdWNlc3NvIHVtIE5VTEwgbmEgY29sdW5hIFNFWE8gCklOU0VSVCBkYm8uVmVuZGVkb3JlcyAoSWQsIE5vbWUsIFNleG8sIENvbWlzc2FvLCBUaXBvRGVTYWxhcmlvLCBUZWxlZm9uZSkKVkFMVUVTICgxLCAnQW50b25pbyBTaWx2YScsIE5VTEwsIDEsICdNZXMnLCAxMjM0NTY3ODkpOw==[/et_pb_dmb_code_snippet]

Imaginemos um cenário em que tenhamos de importar um arquivo texto contendo um cadastro de vendedores. Ao abrir o arquivo texto notamos que foi informado valores de comissão fora da faixa de 1 a 5 (existem comissões zeradas e comissões maiores que 5). Para fazer a importação será necessário desabilitar a constraint na coluna COMISSAO e, após a importação, reabilitá-la.

[et_pb_dmb_code_snippet _builder_version=”4.0.6″ code=”LS0gRGVzYWJpbGl0YW5kbyBhIGNvbnN0cmFpbnQgY2hlY2sgZGEgY29sdW5hIENPTUlTU0FPCkFMVEVSIFRBQkxFIGRiby5WZW5kZWRvcmVzCiAgICBOT0NIRUNLIENPTlNUUkFJTlQgQ0tfVmVuZGVkb3Jlc19Db21pc3NhbzsKCi0tIEluc2VyaW5kbyB2YWxvcmVzIGZvcmEgZGEgZmFpeGEgZGUgMSBhIDUKSU5TRVJUIGRiby5WZW5kZWRvcmVzIChJZCwgTm9tZSwgU2V4bywgQ29taXNzYW8sIFRpcG9EZVNhbGFyaW8sIFRlbGVmb25lKQpWQUxVRVMgCigyLCAnSm9zZScsICdNJywgNywgJ01lcycsIDEyMzQ1Njc4OSksCigzLCAnUGVkcm8nLCAnTScsIDAsICdNZXMnLCAxMjM0NTY3ODkpOwoKLS0gSGFiaWxpdGFuZG8gYSBjb25zdHJhaW50IGNoZWNrIGRhIGNvbHVuYSBDT01JU1NBTwpBTFRFUiBUQUJMRSBkYm8uVmVuZGVkb3JlcwogICAgQ0hFQ0sgQ09OU1RSQUlOVCBDS19WZW5kZWRvcmVzX0NvbWlzc2FvOw==” hover_enabled=”0″]LS0gRGVzYWJpbGl0YW5kbyBhIGNvbnN0cmFpbnQgY2hlY2sgZGEgY29sdW5hIENPTUlTU0FPCkFMVEVSIFRBQkxFIGRiby5WZW5kZWRvcmVzCiAgICBOT0NIRUNLIENPTlNUUkFJTlQgQ0tfVmVuZGVkb3Jlc19Db21pc3NhbzsKCi0tIEluc2VyaW5kbyB2YWxvcmVzIGZvcmEgZGEgZmFpeGEgZGUgMSBhIDUKSU5TRVJUIGRiby5WZW5kZWRvcmVzIChJZCwgTm9tZSwgU2V4bywgQ29taXNzYW8sIFRpcG9EZVNhbGFyaW8sIFRlbGVmb25lKQpWQUxVRVMgCigyLCAnSm9zZScsICdNJywgNywgJ01lcycsIDEyMzQ1Njc4OSksCigzLCAnUGVkcm8nLCAnTScsIDAsICdNZXMnLCAxMjM0NTY3ODkpOwoKLS0gSGFiaWxpdGFuZG8gYSBjb25zdHJhaW50IGNoZWNrIGRhIGNvbHVuYSBDT01JU1NBTwpBTFRFUiBUQUJMRSBkYm8uVmVuZGVkb3JlcwogICAgQ0hFQ0sgQ09OU1RSQUlOVCBDS19WZW5kZWRvcmVzX0NvbWlzc2FvOw==[/et_pb_dmb_code_snippet]

Para eliminar uma constraint, independentemente do seu tipo (seja CHECK, DEFAULT, PRIMARY KEY, etc), faça conforme abaixo.

[et_pb_dmb_code_snippet _builder_version=”4.0.6″ code=”QUxURVIgVEFCTEUgZGJvLlZlbmRlZG9yZXMKICAgIERST1AgQ09OU1RSQUlOVCBDS19WZW5kZWRvcmVzX0NvbWlzc2FvOw==” hover_enabled=”0″]QUxURVIgVEFCTEUgZGJvLlZlbmRlZG9yZXMKICAgIERST1AgQ09OU1RSQUlOVCBDS19WZW5kZWRvcmVzX0NvbWlzc2FvOw==[/et_pb_dmb_code_snippet]

Imaginemos agora o seguinte cenário (absurdo diga-se de passagem): alterar a tabela e adicionar uma constraint que não permita cadastrar, para novas inserções, nomes de vendedores contendo a palavra SILVA. Atente para o fato de que a nossa tabela de VENDEDORES já contém uma pessoa com o sobrenome SILVA. Veja:

Vamos tentar criar essa constraint e ver o que acontece.

[et_pb_dmb_code_snippet _builder_version=”4.0.6″ code=”LS0gVGVudGFuZG8gY3JpYXIgdW1hIGNvbnN0cmFpbnQgbmEgY29sdW5hIE5PTUUKQUxURVIgVEFCTEUgZGJvLlZlbmRlZG9yZXMKICAgIEFERCBDT05TVFJBSU5UIENLX1ZlbmRlZG9yZXNfTm9tZSBDSEVDSyAoTm9tZSBOT1QgTElLRSAnJVNpbHZhJScpOw==” hover_enabled=”0″]LS0gVGVudGFuZG8gY3JpYXIgdW1hIGNvbnN0cmFpbnQgbmEgY29sdW5hIE5PTUUKQUxURVIgVEFCTEUgZGJvLlZlbmRlZG9yZXMKICAgIEFERCBDT05TVFJBSU5UIENLX1ZlbmRlZG9yZXNfTm9tZSBDSEVDSyAoTm9tZSBOT1QgTElLRSAnJVNpbHZhJScpOw==[/et_pb_dmb_code_snippet]

O SQL Server retorna o seguinte erro:

[et_pb_dmb_code_snippet _builder_version=”4.0.6″ code=”TXNnIDU0NywgTGV2ZWwgMTYsIFN0YXRlIDAsIExpbmUgMQpUaGUgQUxURVIgVEFCTEUgc3RhdGVtZW50IGNvbmZsaWN0ZWQgd2l0aCB0aGUgQ0hFQ0sgY29uc3RyYWludCDigJxDS19WZW5kZWRvcmVzX05vbWXigJ0uIFRoZSBjb25mbGljdCBvY2N1cnJlZCBpbiBkYXRhYmFzZSDigJxEQkV4YW1lNzA0NjHigJ0sIHRhYmxlIOKAnGRiby5WZW5kZWRvcmVz4oCdLCBjb2x1bW4g4oCYTm9tZeKAmS4=” hover_enabled=”0″]TXNnIDU0NywgTGV2ZWwgMTYsIFN0YXRlIDAsIExpbmUgMQpUaGUgQUxURVIgVEFCTEUgc3RhdGVtZW50IGNvbmZsaWN0ZWQgd2l0aCB0aGUgQ0hFQ0sgY29uc3RyYWludCDigJxDS19WZW5kZWRvcmVzX05vbWXigJ0uIFRoZSBjb25mbGljdCBvY2N1cnJlZCBpbiBkYXRhYmFzZSDigJxEQkV4YW1lNzA0NjHigJ0sIHRhYmxlIOKAnGRiby5WZW5kZWRvcmVz4oCdLCBjb2x1bW4g4oCYTm9tZeKAmS4=[/et_pb_dmb_code_snippet]

Isso acontece porque no momento da criação da constraint o SQL Server verifica, por padrão, se existe algum valor na coluna que não atenda à regra especificada. Como o nosso cenário diz que essa regra deva ser aplicada apenas para “novas inserções”, vejamos como contornar tal situação.

[et_pb_dmb_code_snippet _builder_version=”4.0.6″ code=”QUxURVIgVEFCTEUgZGJvLlZlbmRlZG9yZXMgV0lUSCBOT0NIRUNLCiAgICBBREQgQ09OU1RSQUlOVCBDS19WZW5kZWRvcmVzX05vbWUgQ0hFQ0sgKE5vbWUgTk9UIExJS0UgJyVTaWx2YSUnKTs=” hover_enabled=”0″]QUxURVIgVEFCTEUgZGJvLlZlbmRlZG9yZXMgV0lUSCBOT0NIRUNLCiAgICBBREQgQ09OU1RSQUlOVCBDS19WZW5kZWRvcmVzX05vbWUgQ0hFQ0sgKE5vbWUgTk9UIExJS0UgJyVTaWx2YSUnKTs=[/et_pb_dmb_code_snippet]

Usamos a opção WITH NOCHECK, a qual instrui o SQL Server a criar a constraint sem fazer qualquer verificação. Desta forma, a constraint terá efeito somente para novas inserções. Exemplo:

[et_pb_dmb_code_snippet _builder_version=”4.0.6″ code=”SU5TRVJUIGRiby5WZW5kZWRvcmVzIChJZCwgTm9tZSwgU2V4bywgQ29taXNzYW8sIFRpcG9EZVNhbGFyaW8sIFRlbGVmb25lKQpWQUxVRVMgKDQsICdCcnVubyBTaWx2YScsICdNJywgMiwgJ01lcycsIDEyMzQ1Njc4OSk7″ hover_enabled=”0″]SU5TRVJUIGRiby5WZW5kZWRvcmVzIChJZCwgTm9tZSwgU2V4bywgQ29taXNzYW8sIFRpcG9EZVNhbGFyaW8sIFRlbGVmb25lKQpWQUxVRVMgKDQsICdCcnVubyBTaWx2YScsICdNJywgMiwgJ01lcycsIDEyMzQ1Njc4OSk7[/et_pb_dmb_code_snippet]

Table-Level CHECK Constraints

Além de checar valores para uma coluna em particular, uma constraint CHECK pode também ser aplicada no nível da tabela para checar valores relacionados em mais de uma coluna (desde que sejam da mesma tabela). Segue exemplo.

[et_pb_dmb_code_snippet _builder_version=”4.0.6″ code=”Q1JFQVRFIFRBQkxFIGRiby5GZXJpYXMKKCAgICBJZCBJTlQgTk9UIE5VTEwgUFJJTUFSWSBLRVksCiAgICBGdW5jaW9uYXJpbyBWQVJDSEFSKDUwKSBOT1QgTlVMTCwKICAgIERhdGFEZUluaWNpbyBEQVRFVElNRTIgTk9UIE5VTEwsCiAgICBEYXRhRGVGaW0gREFURVRJTUUyIE5PVCBOVUxMLAogICAgQ09OU1RSQUlOVCBDS19GZXJpYXNfUGVyaW9kbyBDSEVDSyAoRGF0YURlSW5pY2lvIDwgRGF0YURlRmltKQopOwoKLS0gVGVudGFuZG8gaW5zZXJpciB1bWEgRGF0YSBkZSBJbsOtY2lvIGludsOhbGlkYQpJTlNFUlQgZGJvLkZlcmlhcyAoSWQsIEZ1bmNpb25hcmlvLCBEYXRhRGVJbmljaW8sIERhdGFEZUZpbSkKVkFMVUVTICgxLCAnTWFyaWFuYSBTb3V6YScsICcyMDEyLTEwLTMxJywgJzIwMTItMTAtMzAnKTs=” hover_enabled=”0″]Q1JFQVRFIFRBQkxFIGRiby5GZXJpYXMKKCAgICBJZCBJTlQgTk9UIE5VTEwgUFJJTUFSWSBLRVksCiAgICBGdW5jaW9uYXJpbyBWQVJDSEFSKDUwKSBOT1QgTlVMTCwKICAgIERhdGFEZUluaWNpbyBEQVRFVElNRTIgTk9UIE5VTEwsCiAgICBEYXRhRGVGaW0gREFURVRJTUUyIE5PVCBOVUxMLAogICAgQ09OU1RSQUlOVCBDS19GZXJpYXNfUGVyaW9kbyBDSEVDSyAoRGF0YURlSW5pY2lvIDwgRGF0YURlRmltKQopOwoKLS0gVGVudGFuZG8gaW5zZXJpciB1bWEgRGF0YSBkZSBJbsOtY2lvIGludsOhbGlkYQpJTlNFUlQgZGJvLkZlcmlhcyAoSWQsIEZ1bmNpb25hcmlvLCBEYXRhRGVJbmljaW8sIERhdGFEZUZpbSkKVkFMVUVTICgxLCAnTWFyaWFuYSBTb3V6YScsICcyMDEyLTEwLTMxJywgJzIwMTItMTAtMzAnKTs=[/et_pb_dmb_code_snippet]

Veja que a constraint check força a integridade, garantindo que a data de início não seja igual ou maior que a data de fim.

 Conclusão

No próximo post vamos finalizar o assunto de constraints, abordando os tipos primary key, unique key e foreign key. Até lá!