Utilizo o script abaixo para verificar o status de todas as tabelas de um database, reindexar os índices das mesmas, e atualizar o espaço utilizado pelos índices.
Na primeira parte, identifico o nome do database e salvo em uma variável, para uso mais adiante.
O conceito do script baseia-se num cursor, criado a partir da lista de tabelas, armazenadas na tabela do sistema SysObjects (se preferir, utilize as tabelas do Information_Schema).
O comando para verificar a tabela, é o "dbcc checktable".
Detalhe importante: o database precisa estar em modo SINGLE_USER para este comando ser executado com sucesso.
O comando para reindexar a tabela é o "dbcc dbreindex".
O comando para atualizar o espaço utilizado é o "dbcc updateusage".
Consulte o BOL para sintaxe dos parâmetros.
Para usá-lo, abra o Query Analyzer, e posicione no database desejado.
Ou acrescente na primeira linha, o comando USE, para selecionar o database, caso necessite executar a partir do utilitário O-SQL.
-- Inicio
DECLARE @DsDatabase SYSNAME
SELECT @DsDatabase = D.Name
FROM Master..SysProcesses P, Master..SysDatabases D
WHERE P.Dbid = D.Dbid
AND P.Spid = @@Spid
DECLARE @NomeTabela VARCHAR(80)
DECLARE CursorTabelas CURSOR FAST_FORWARD
FOR
SELECT DISTINCT CONVERT(VARCHAR(80), T.Name) AS Objeto
FROM SysObjects T, SysIndexes I
WHERE T.Type = 'U'
AND I.Id = T.Id
ORDER BY Objeto
OPEN CursorTabelas
FETCH NEXT FROM CursorTabelas INTO @NomeTabela
WHILE @@fetch_status = 0
BEGIN
PRINT 'Reindexando tabela ' + @NomeTabela + '...'
IF (SELECT DATABASEPROPERTYEX (@DsDatabase, 'UserAccess')) = 'SINGLE_USER'
DBCC CHECKTABLE (@NomeTabela, REPAIR_ALLOW_DATA_LOSS)
DBCC DBREINDEX (@NomeTabela)
DBCC UPDATEUSAGE (@DsDatabase, @NomeTabela)
FETCH NEXT FROM CursorTabelas INTO @NomeTabela
END
CLOSE CursorTabelas
DEALLOCATE CursorTabelas
-- Fim
2 comentários:
muito bom. Consegui resolver meu problema num banco que estava corrompido.
LEGAL!!! CONSEGUI RESOLVER MEU PROBLEMA COM UM BANCO CORROMPIDO!
Postar um comentário