Por que executar ALTER TABLE em uma coluna faz com que ela passe de NOT NULL para NULL?

8

Estou atualizando em massa um banco de dados do SQL Server. Estou alterando todas as nossas numeric(38,0)colunas para int (sim, os scripts do SQL Server foram criados a partir dos scripts do Oracle) . Usando SMO e C # (eu sou engenheiro de software) , consegui gerar scripts muito bons, como o SQL Server Management studio faria. Tudo funciona muito bem, exceto por um problema específico:

para um punhado de tabelas, quando eu chamo ALTER TABLE [myTable] ALTER COLUMN [columnA] INT, decide também mudar a coluna de NOT NULL to NULL. É claro que isso é um problema enorme, pois preciso regenerar chaves primárias para a maioria dessas tabelas nessas colunas específicas.

Obviamente, tenho muitas opções usando o SMO para descobrir quais colunas são chaves primárias e forçá-las a não serem NULL após ou enquanto estou atualizando o tipo de dados, mas estou realmente curioso para saber o que pode estar causando isso.

Eric Liprandi
fonte
Você pode descobrir isso se as colunas também são membros da chave primária via T / SQL. SMO não é necessário.
mrdenny

Respostas:

10

Depende da sua configuração de SET ANSI_NULL_DFLT_OFF ou SET ANSI_NULL_DFLT_ON (leia-os para outros efeitos também em SET ANSI_DEFAULTS).

Pessoalmente, eu teria especificado essa restrição explicitamente se quisesse colunas nulas ou não nulas, em vez de depender das configurações do ambiente.

ALTER TABLE [myTable] ALTER COLUMN [columnA] INT NOT NULL

Você pode emitir esse comando novamente e se uma coluna já estiver com a nulidade desejada, o comando será ignorado.

No entanto, você também disse que só precisa alterá-lo onde faz parte de uma chave primária. Isso não deve ter influência se uma coluna pode ser anulável ou não a partir da fase de modelagem / implementação

gbn
fonte