CREATE PROCEDURE dbo.psu_calcul_seuil_segment @par_nom_base VARCHAR(30), --nom de la base de données auquel appartient le segment @par_nom_segment VARCHAR(30), --nom du segment sur lequel seront placés les seuils @par_nom_table_resultat VARCHAR(30), --nom de la table dans laquelle vont être placés les résultats d'atteinte de seuil @par_nom_procedure_resultat VARCHAR(30), --nom de la procédure qui est déclenchée pour chaque seuil @par_debut_intervalle INT, --limite supérieure des pages au dessus desquelles aucun seuil ne sera créé @par_fin_intervalle INT, --limite inférieure des pages en dessous desquelles aucun seuil ne sera créé @par_increment_intervalle INT, --increment (en nombre de pages) entre les seuils @par_nom_procedure_fin VARCHAR(30) --nom de la procédure qui éliminera table résultat, procédure déclenchée par les seuils et les seuils AS BEGIN --Validité de l'intervalle donné IF (@par_debut_intervalle >= @par_fin_intervalle) OR (@par_increment_intervalle <=0) RAISERROR 99999 'Données de l''intervalle non valides.' ELSE BEGIN --Vérification de l'existence du segment IF (SELECT COUNT(*) FROM syssegments WHERE name = @par_nom_segment) <> 1 RAISERROR 99999 'Segment ''%1!'' absent de la base.', @par_nom_segment ELSE BEGIN --Vérification de la disponibilité du nombre de seuils IF (SELECT COUNT(*) FROM syssegments, systhresholds WHERE syssegments.segment = systhresholds.segment AND name = @par_nom_segment ) + (@par_fin_intervalle - @par_debut_intervalle) / @par_increment_intervalle > 255 RAISERROR 99999 'Nombre de seuils disponibles insuffisant.' ELSE BEGIN --Création de la table recevant les résultats EXECUTE ('CREATE TABLE ' + @par_nom_table_resultat + ' ( col_nom_segment VARCHAR(30), col_espace_libre INT, col_date_seuil DATETIME)') --Création de la procédure d'exécution à atteinte du seuil EXECUTE ('CREATE PROCEDURE ' + @par_nom_procedure_resultat + ' @dbname VARCHAR(30), @segmentname VARCHAR(30), @space_left INT, @status INT AS BEGIN INSERT INTO ' + @par_nom_table_resultat + ' VALUES(@segmentname, @space_left , GETDATE()) END') --Conversion des paramètres de l'intervalle en chaine de caractères pour l'utilisation dans la chaine EXECUTE DECLARE @var_debut_intervalle VARCHAR(10), --variable convertissant @par_debut_intervalle en chaine de caractères @var_fin_intervalle VARCHAR(10), --variable convertissant @par_fin_intervalle en chaine de caractères @var_increment_intervalle VARCHAR(10) --variable convertissant @par_increment_intervalle en chaine de caractères SELECT @var_debut_intervalle = CONVERT(VARCHAR(10),@par_debut_intervalle), @var_fin_intervalle = CONVERT(VARCHAR(10),@par_fin_intervalle), @var_increment_intervalle = CONVERT(VARCHAR(10),@par_increment_intervalle) --Création de la procédure de suppression des seuils, de la procédure résultat et dela table résultat EXECUTE ('CREATE PROCEDURE ' + @par_nom_procedure_fin + ' AS BEGIN DECLARE @var_debut_intervalle INT, @var_fin_intervalle INT, @var_increment_intervalle INT, @var_nom_base VARCHAR(30), @var_nom_segment VARCHAR(30) DROP TABLE ' + @par_nom_table_resultat + ' DROP PROCEDURE ' + @par_nom_procedure_resultat + ' SELECT @var_debut_intervalle = ' + @var_debut_intervalle + ', @var_fin_intervalle = ' + @var_fin_intervalle + ', @var_increment_intervalle = ' + @var_increment_intervalle + ', @var_nom_base = "' + @par_nom_base + '", @var_nom_segment = "' + @par_nom_segment + '" WHILE @var_debut_intervalle < @var_fin_intervalle BEGIN EXECUTE sp_dropthreshold @var_nom_base, @var_nom_segment, @var_debut_intervalle SELECT @var_debut_intervalle = @var_debut_intervalle + @var_increment_intervalle END END') --Création des seuils WHILE @par_debut_intervalle < @par_fin_intervalle BEGIN EXECUTE sp_addthreshold @par_nom_base, @par_nom_segment, @par_debut_intervalle, @par_nom_procedure_resultat SELECT @par_debut_intervalle = @par_debut_intervalle + @par_increment_intervalle END END END END END