Continuo recebendo um problema estranho com alguns bancos de dados após a atualização para o SQL Server 2012 (do SQL Server 2005 ou do SQL Server 2008 R2).
O backup ( .bak
) está bem na versão mais antiga. Eu faço DBCC CHECKDB
no SQL Server 2008 R2 e está tudo bem. Eu crio um .bak
arquivo, restauro no SQL Server 2012 e executo DBCC CHECKDB
-> 2 erros de consistência na tabela.
Usando sugestões do artigo " Atualizando para o SQL 2012: dez coisas que você não quer perder ", tentei DBCC CHECKDB WITH DATA_PURITY;
antes e depois da atualização.
Este é um problema conhecido/comum?
Os detalhes do erro são:
Msg 8970, Level 16, State 1, Server NUX2012\S11, Line 1
Row error: Object ID 277576027, index ID 2, partition ID 581141175926784, alloc unit ID 581141175926784 (type In-row data), page ID (1:258) , ID da linha 1. A coluna 'ID' foi criada NÃO NULL, mas é NULL na linha.Msg 8970, Level 16, State 1, Server NUX2012\S11, Line 1
Row error: Object ID 277576027, index ID 2, partition ID 581141175926784, alloc unit ID 581141175926784 (type In-row data), page ID (1:258) , ID da linha 2. A coluna 'ID' foi criada NÃO NULL, mas é NULL na linha.
Obviamente verifiquei a tabela em questão e a ID
coluna não possui nenhuma linha com NULL
valores.
Hum... que interessante...
Portanto, o índice está de alguma forma corrompido antes da atualização e, quando você vir um erro como o acima, poderá corrigi-lo antes e depois da atualização, mas somente após a atualização
DBCC
detectará o problema.Passos:
DBCC CHECKDB
para obter um nome de coluna.ALTER INDEX [my index name] ON [my table name] DISABLE;
(algumas chaves estrangeiras podem ser desativadas junto com ele, não se preocupe com isso).ALTER INDEX [my index name] ON [my table name] REBUILD;
.DBCC CHECKDB;
para garantir que está tudo bem.Isso funcionou para mim, mas YMMV. Novamente, você pode fazer acima no MS SQL 2008 R2 e restaurar um novo backup no MS SQL 2012 ou fazer acima quando já estiver no MS SQL 2012.