Eu quero ser capaz de executar uma consulta para obter as informações cruciais sobre o status de um banco de dados. Ou seja, eu quero que a consulta seja capaz de dizer se o banco de dados está ou não em bom estado.
Esta é a consulta que herdei para esta verificação:
SELECT name AS [SuspectDB],
DATABASEPROPERTY(name, N'IsSuspect') AS [Suspect],
DATABASEPROPERTY(name, N'IsOffline') AS [Offline],
DATABASEPROPERTY(name, N'IsEmergencyMode') AS [Emergency],
has_dbaccess(name) AS [HasDBAccess]
FROM sysdatabases
WHERE (DATABASEPROPERTY(name, N'IsSuspect') = 1)
OR (DATABASEPROPERTY(name, N'IsOffline') = 1)
OR (DATABASEPROPERTY(name, N'IsEmergencyMode') = 1)
OR (has_dbaccess(name) = 0)
Se essa consulta retornar algum resultado, a suposição feita é que o banco de dados está em um estado suspeito ou potencialmente ruim.
Existe uma maneira melhor de fazer isso?
Se você estiver usando o SQL 2005+ e quiser apenas retornar o nome do banco de dados onde o banco de dados não está no estado "ONLINE", eu usaria isto:
Lembre-se de que os bancos de dados que participam do espelhamento ou envio de logs não estarão online ou podem mudar de estado regularmente. Para obter mais informações sobre o DMV sys.databases, consulte a documentação aqui: http://msdn.microsoft.com/en-us/library/ms178534.aspx
Eu usaria o sys.databases mais recente, não o sydatabases , mas, caso contrário, tudo bem
Além disso, você não precisa de chamadas DATABASEPROPERTY
a forma que encontrei para ver o status do db é usar a função DATABASEPROPERTYEX ( database , property ), assim:
SELECT DATABASEPROPERTYEX('AdventureWorks', 'Status').
Os status são bastante autoexplicativos:
ONLINE = Banco de dados disponível para consulta.
OFFLINE = O banco de dados foi explicitamente colocado offline.
RESTORING = O banco de dados está sendo restaurado.
RECOVERING = O banco de dados está se recuperando e ainda não está pronto para consultas.
SUSPECT = O banco de dados não foi recuperado.
EMERGENCY = O banco de dados está em estado de emergência, somente leitura. O acesso é restrito a membros sysadmin
No blog de Ola Hallengren (um SQL MVP), em sua ferramenta para verificar a integridade do banco de dados, descobri que ele está usando a exibição sys.database_recovery_status para consultar um status de banco de dados. Se o banco de dados tiver uma linha nessa exibição, ele estará ativo e chutando, caso contrário, estará offline.
PS: a função databaseproperty que você usa será removida em versões futuras, então databasepropertyex a está substituindo.
Em vez de consultar condições específicas, eu daria uma olhada em qualquer coisa em sys.databases onde state_desc <> 'ONLINE'. Além disso, dependendo do que você deseja fazer, has_dbaccess pode gerar alguns falsos positivos.
Eu gosto deste: