Digamos que eu tenha a seguinte tabela:
CREATE TABLE test(test_id int not null identity primary key,
field1 int not null,
field2 int
);
CREATE INDEX IDX_test_field1 ON test(field1);
CREATE INDEX IDX_test_field2 ON test(field2);
Agora ALTER TABLE test ALTER COLUMN field1 int
funciona e field1
permite null
.
No entanto, não posso mudar ALTER TABLE test ALTER COLUMN field2 int not null
por causa de
ALTER TABLE ALTER COLUMN field2 falhou porque um ou mais objetos acessam esta coluna.
Além disso, não posso mudar field1
de volta para not null
.
No entanto, posso adicionar e descartar a restrição de verificação quantas vezes quiser:
ALTER TABLE test ADD CONSTRAINT CHK_NN_field2 CHECK (field2 IS NOT NULL);
DROP CONSTRAINT CHK_NN_field2` without any problems.
É um comportamento bem definido? Alguém poderia explicar por que isso acontece ou me indicar a documentação?
Estou usando o SQL Server 2008 R2, se isso for importante.
Obrigada.
A documentação relevante está aqui
Na prática, parece que o SQL Server permite alguns casos adicionais além dos mencionados na documentação.
Como você mostra em sua pergunta
ALTER TABLE test ALTER COLUMN field1 int null
, de fato funciona, de modo que as restrições às alterações nas colunas usadas nos índices parecem ser as mesmas das estatísticas criadas pelo usuário.Além disso, a ressalva mencionada sobre chaves primárias também parece falsa. O seguinte funciona bem.
Seus índices em field1 e field2 estão impedindo você de alterar as colunas de NULL para NOT NULL. Elimine o índice, altere-o para NOT NULL e recrie o índice.
NULL
é uma restrição mais flexível do queNOT NULL
.O que aconteceria se você tivesse
NULL
campos quando tentasse mudar paraNOT NULL
(violação de restrição e falha) versus quando tivesseNOT NULL
, mudando paraNULL
(sem impacto).Quando você cria uma restrição, os dados devem ser validados para estar em conformidade com essa restrição antes da alteração da tabela (ou falha) - pelo que observei, esse comportamento não ocorre em alterar ou descartar e, em vez disso, alterando as restrições dessa maneira é simplesmente impedido.