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.
fonte
Respostas:
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.
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
fonte
SET ANSI_NULL_DFLT_ON
não se aplica aqui. Os padrões ANSI_NULL estão sempre ativados para ALTER COLUMN; se não especificado, a coluna é anulável.