Introdução
Recentemente, durante uma atualização de um aplicativo, recebi a seguinte mensagem de erro:
Msg 5074 Level 16 State 1 Line 1 The statistics 'BreakingStuff' is dependent on column 'TaskText'. Msg 4922 Level 16 State 9 Line 1 ALTER TABLE ALTER COLUMN TaskText failed because one or more objects access this column.
Exemplo de mensagem de erro baseada em análise
Esta foi uma estatística criada manualmente em uma coluna de uma tabela. Na verdade, havia várias estatísticas criadas manualmente referenciando a coluna em questão.
Gambiarra
Depois de descartar as estatísticas da tabela, executar a atualização e recriar as estatísticas, tudo estava funcionando bem.
Análise
Comecei com uma simulação trivial em db<>fiddle para ver se conseguia reproduzir o problema. Depois de alguns ajustes (trocadilhos), descobri que a mensagem de erro só é acionada se eu reduzir o tamanho da coluna.
por exemplo varchar(50)
-->varchar (40)
Aqui está o db<>fiddle .
Os únicos avisos que encontrei no Microsoft Learn foram:
-
Modificar o tipo de dados de uma coluna que já contém dados pode resultar na perda permanente de dados quando os dados existentes são convertidos para o novo tipo. Além disso, o código e os aplicativos que dependem da coluna modificada podem falhar. Isso inclui consultas, visualizações, procedimentos armazenados, funções definidas pelo usuário e aplicativos cliente. Observe que essas falhas ocorrerão em cascata. Por exemplo, um procedimento armazenado que chama uma função definida pelo usuário que depende da coluna modificada pode falhar. Considere cuidadosamente quaisquer alterações que você deseja fazer em uma coluna antes de fazê-la.
Referência: Modificar colunas (Microsoft Learn | SQL)
Eu estava ciente de que reduzir o tamanho da coluna possivelmente resultaria em perda de dados, mas não foi o caso, pois os dados eram todos menores que varchar(40)
.
Questões
- Por que reduzir o tamanho da coluna resulta em erro devido às estatísticas criadas manualmente?
- Por que aumentar o tamanho de uma coluna não resulta em erro nas estatísticas criadas manualmente?