Voici une petite procédure pour obtenir les informations sur les volumes et taux d’occupation des disques de votre serveur SQL.
USE master;
GO
CREATE SCHEMA SOS;
GO
CREATE PROCEDURE SOS.P_DISK_SPACE
AS
SET NOCOUNT ON;
-- variables locales
DECLARE @HDL int, @FSO_TOKEN int, @LCT_LECTEUR char(1), @NUM_LECTEUR int, @TAILLE_TOTALE varchar(32), @MB bigint;
DECLARE @T_LECTEUR_LCT TABLE
(LCT_NOM_SERVEUR VARCHAR(15),
LCT_LECTEUR CHAR(1) PRIMARY KEY,
LCT_NUM INT,
LCT_ESPACE_LIBRE FLOAT NULL,
LCT_TAILLE_TOTALE FLOAT NULL,
LCT_DATEHEURE DATETIME NULL)
-- assignation préalable :
SET @MB = 1048576;
INSERT @T_LECTEUR_LCT(LCT_LECTEUR, LCT_ESPACE_LIBRE)
EXEC master.dbo.xp_fixeddrives;
-- appel OLE Ã fso (File System Object) pour manipuler les fichiers
-- création d'un jeton de communication avec le FSO
EXEC @HDL = sp_OACreate 'Scripting.FileSystemObject', @FSO_TOKEN OUT
IF @HDL <> 0
EXEC sp_OAGetErrorInfo @FSO_TOKEN;
-- tant que la table n'est pas complétement renseignée :
WHILE EXISTS(SELECT *
FROM @T_LECTEUR_LCT
WHERE LCT_TAILLE_TOTALE IS NULL)
BEGIN
-- selection du premier lecteur
SELECT TOP 1 @LCT_LECTEUR = LCT_LECTEUR
FROM @T_LECTEUR_LCT
WHERE LCT_TAILLE_TOTALE IS NULL;
-- obtention du n° du lecteur
EXEC @HDL = sp_OAMethod @FSO_TOKEN, 'GetDrive', @NUM_LECTEUR OUT, @LCT_LECTEUR
--EXEC @hr = sp_OAMethod @fso,'GetDrive', @odrive OUT, @drive
IF @HDL <> 0
EXEC sp_OAGetErrorInfo @FSO_TOKEN;
-- obtention du volume du lecteur
EXEC @HDL = sp_OAGetProperty @NUM_LECTEUR, 'TotalSize', @TAILLE_TOTALE OUT
IF @HDL <> 0
EXEC sp_OAGetErrorInfo @NUM_LECTEUR;
-- mise à jour de la table
UPDATE @T_LECTEUR_LCT
SET LCT_TAILLE_TOTALE = @TAILLE_TOTALE/@MB,
LCT_NUM = @NUM_LECTEUR,
LCT_NOM_SERVEUR = host_name(),
LCT_DATEHEURE = GETDATE()
WHERE LCT_LECTEUR = @LCT_LECTEUR;
END
-- suppression du jeton FSO
EXEC @HDL = sp_OADestroy @FSO_TOKEN;
IF @HDL <> 0
EXEC sp_OAGetErrorInfo @FSO_TOKEN;
-- extraction des résultats
SELECT LCT_NOM_SERVEUR, LCT_LECTEUR, LCT_NUM,
LCT_TAILLE_TOTALE as TOTAL_MO, LCT_ESPACE_LIBRE as ESPACE_LIBRE_MO,
CAST((LCT_ESPACE_LIBRE/(LCT_TAILLE_TOTALE*1.0))*100.0 as DECIMAL(16,2)) as POURCENT_LIBRE,
LCT_DATEHEURE
FROM @T_LECTEUR_LCT
ORDER BY LCT_LECTEUR;
Pour la faire fonctionner :
EXEC master.SOS.P_DISK_SPACE
Résultat :
LCT_NOM_SERVEUR LCT_LECTEUR LCT_NUM TOTAL_MO ESPACE_LIBRE_MO POURCENT_LIBRE LCT_DATEHEURE
--------------- ----------- ----------- ----------- ---------------------- ----------------- -----------------------
HPWFRED C 33488638 464629 196586 42.31 2011-11-29 12:19:35.173
HPWFRED D 50265854 476937 121052 25.38 2011-11-29 12:19:35.177
HPWFRED S 67043070 1907757 1163739 61.00 2011-11-29 12:19:35.180
HPWFRED Z 83820286 12291 4026 32.76 2011-11-29 12:19:35.183
NOTE : cette procédure nécessite d’utiliser des appels aux objets OLE qui sont à défaut bloqués dans sp_configure. Il est possible de les débloquer temporairement à l’aide de la commande suivante :
EXEC ('sp_configure ''Ole Automation Procedures'', 1;')
EXEC ('RECONFIGURE')
EXEC ('RECONFIGURE')
Puis de les rebloquer avec :
EXEC ('sp_configure ''Ole Automation Procedures'', 0;')
EXEC ('RECONFIGURE')
EXEC ('RECONFIGURE')
--------
Frédéric Brouard, SQLpro - ARCHITECTE DE DONNÉES, http://sqlpro.developpez.com/
Expert bases de données relationnelles et langage SQL. MVP Microsoft SQL Server
www.sqlspot.com : modélisation, conseil, audit, optimisation, tuning, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *