Je veux pouvoir exécuter une requête pour obtenir les informations cruciales sur l'état d'une base de données. C'est-à-dire que je veux que la requête puisse dire si la base de données est en bon état ou non.
Voici la requête dont j'ai hérité pour cette vérification:
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)
Si cette requête renvoie des résultats, l'hypothèse posée est que la base de données est dans un état suspect ou potentiellement mauvais.
Y a-t-il une meilleure manière de faire cela?
Si vous utilisez SQL 2005+ et que vous souhaitez uniquement renvoyer le nom de la base de données là où la base de données n'est pas dans l'état "EN LIGNE", j'utiliserais ceci:
SELECT
name
FROM sys.databases
WHERE state != 0;
N'oubliez pas que les bases de données participant à la mise en miroir ou à l'envoi de journaux ne seront pas en ligne ou peuvent changer d'état régulièrement. Pour plus d'informations sur le DMV sys.databases, voir la documentation ici: http://msdn.Microsoft.com/en-us/library/ms178534.aspx
J'utiliserais le plus récent sys.databases pas sydatabases mais sinon c'est OK
Pas moins, vous n'avez pas besoin d'appels DATABASEPROPERTY
SELECT
name, state_desc
FROM
sys.databases
WHERE
state IN (4, 5, 6)
la façon dont j'ai trouvé pour voir l'état de la base de données est d'utiliser la fonction DATABASEPROPERTYEX (base de données, propriété), comme ceci:
SELECT DATABASEPROPERTYEX ('AdventureWorks', 'Status').
Les statuts sont assez explicites:
ONLINE = La base de données est disponible pour la requête.
OFFLINE = La base de données a été explicitement mise hors ligne.
RESTORING = La base de données est en cours de restauration.
RECOVERING = La base de données est en cours de récupération et n'est pas encore prête pour les requêtes.
SUSPECT = La base de données n'a pas récupéré.
EMERGENCY = La base de données est en état d'urgence, en lecture seule. L'accès est limité aux membres sysadmin
Dans le blog d'Ola Hallengren (un MVP SQL), dans son outil pour vérifier l'intégrité de la base de données, j'ai trouvé qu'il utilisait la vue sys.database_recovery_status pour interroger un statut db. Si la base de données a une ligne dans cette vue, elle est en direct et, sinon, elle est hors ligne.
PS: la fonction databaseproperty que vous utilisez va être supprimée dans les futures versions, donc databasepropertyex la remplace.
Plutôt que de rechercher des conditions spécifiques, je regarderais n'importe quoi dans sys.databases où state_desc <> 'ONLINE'. En outre, selon ce que vous cherchez à faire, has_dbaccess peut générer des faux positifs.
J'aime celui la:
SELECT name, state_desc
FROM sys.databases
name state_desc
------------------------------- ----------------
master ONLINE
tempdb ONLINE
model ONLINE
msdb ONLINE
TestTableDatabase2005 RECOVERY_PENDING