Database
 sql >> Base de données >  >> RDS >> Database

Système de messagerie automatique pour envoyer le rapport récapitulatif de la base de données

La surveillance de la base de données est la tâche la plus essentielle de tout administrateur de base de données. Les grandes organisations et entreprises disposent de plusieurs serveurs de bases de données situés soit dans le même centre de données, soit dans des centres de données géographiquement différents. Il existe de nombreux outils standard pour la surveillance des bases de données. Ces outils utilisent les vues de gestion dynamique SQL Server et la procédure stockée système pour remplir les données. À l'aide de ces DMV, nous pouvons créer notre système automatisé personnalisé pour renseigner l'état de la base de données et envoyer le rapport par e-mail.

Dans cet article, je vais montrer comment nous pouvons utiliser la procédure stockée du système et le serveur lié pour remplir les informations des bases de données situées sur différents serveurs et planifier le travail pour envoyer le rapport.

Dans cette démo, je vais effectuer les tâches suivantes :

  1. Créer les procédures stockées requises sur TTI609-VM1 , TTI609-VM2, et TTI412-VM serveurs pour remplir les informations de la base de données, des objets de base de données et des travaux SQL.
  2. Créer une procédure stockée pour remplir le résumé de la base de données, le résumé des objets de la base de données et le résumé de la tâche SQL à partir du TTI609-VM1 et TTI609-VM2 serveurs et les stocker dans des tables associées.
  3. Créez un package SSIS qui effectue les tâches suivantes :
      • Exécute une procédure stockée à l'aide de Exécuter la tâche de script SQL .
      • Exporter les données des tables SQL créées sur TTI412-VM et stockez-le dans l'onglet individuel d'un fichier Excel.
  4. Créez une tâche SQL Server pour exécuter le package SSIS afin de remplir les informations de la base de données et la procédure stockée pour envoyer le rapport par e-mail.

L'image suivante illustre la configuration de la démo :

Voici la liste des procédures stockées :

Voici la liste des tables :

Créer des procédures stockées sur les deux serveurs de base de données

Comme je l'ai mentionné, nous allons remplir les données du TTI609-VM1 et TTI609-VM2 les serveurs. Les procédures stockées utilisées pour remplir la base de données resteront les mêmes sur les deux serveurs.
Donc, tout d'abord, j'ai créé une base de données nommée DBATools sur les deux serveurs. J'ai créé une procédure stockée dans ces bases de données. Pour ce faire, exécutez le code suivant sur le TTI609-VM1 et TTI609-VM2 serveurs :

USE [master] 
go 
/****** Object:  Database [DBATools]    Script Date: 10/25/2018 11:25:27 AM ******/ 
CREATE DATABASE [DBATools] containment = none ON PRIMARY ( NAME = N'DBATools', 
filename = 
N'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\DBATools.mdf' 
, size = 3264kb, maxsize = unlimited, filegrowth = 1024kb ) log ON ( NAME = 
N'DBATools_log', filename = 
N'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\DBATools_log.ldf' 
, size = 816kb, maxsize = 2048gb, filegrowth = 10%) 
go

Créez une procédure stockée nommée Pull_Database_Information dans les DBATools base de données. Cette procédure stockée remplit les informations suivantes de toutes les bases de données existantes sur les deux serveurs de base de données.

  1. Nom de la base de données.
  2. Niveau de compatibilité de la base de données.
  3. État de la base de données (ONLINE/OFFLINE/RESTORING/SUSPEND).
  4. Modèle de récupération de base de données (SIMPLE / FULL / BULK-LOGGED).
  5. Taille de la base de données en Mo.
  6. Taille totale du fichier de données.
  7. Taille du fichier de données utilisé.
  8. Taille totale du fichier journal.
  9. Taille du fichier journal utilisé.

Exécutez le code suivant dans les DBATools base de données des deux serveurs de base de données pour créer la procédure stockée :

USE DBAtools 
go 
CREATE PROCEDURE Pull_Database_Information 
AS 
  BEGIN 
      IF Object_id('tempdb.dbo.#DBSize') IS NOT NULL 
        DROP TABLE #dbsize 

      CREATE TABLE #dbsize 
        ( 
           database_id         INT PRIMARY KEY, 
           data_file_used_size DECIMAL(18, 2), 
           log_file_used_size  DECIMAL(18, 2) 
        ) 

      DECLARE @SQLCommand NVARCHAR(max) 

      SELECT @SQLCommand = Stuff((SELECT '     USE [' + d.NAME + ']     INSERT INTO #DBSize (database_id, data_file_used_size, log_File_used_size)     SELECT           DB_ID()         , SUM(CASE WHEN [type] = 0 THEN space_used END)         , SUM(CASE WHEN [type] = 1 THEN space_used END)     FROM (         SELECT s.[type], space_used = SUM(FILEPROPERTY(s.name, ''SpaceUsed'') * 8. / 1024)         FROM sys.database_files s         GROUP BY s.[type]     ) t;' 
                                  FROM   sys.databases d 
                                  WHERE  d.[state] = 0 
                                  FOR xml path(''), type).value('.', 
                           'NVARCHAR(MAX)'), 
                           1, 2, 
                                  '') 

      EXEC sys.Sp_executesql 
        @SQLCommand 

      SELECT d.database_id         AS 'Database ID', 
             d.NAME                AS 'Database Name', 
             d.state_desc          AS 'Database State', 
             d.recovery_model_desc AS 'Recovery Model', 
             t.total_db_size       AS 'Database Size', 
             t.data_file_size      AS 'Data File Size', 
             s.data_file_used_size AS 'Data File Used', 
             t.log_file_size       AS 'Log file size', 
             s.log_file_used_size  AS 'Log File Used' 
      FROM   (SELECT database_id, 
                     log_file_size = Cast(Sum(CASE 
                                                WHEN [type] = 1 THEN size 
                                              END) * 8. / 1024 AS DECIMAL(18, 2) 
                                     ), 
                     data_file_size = Cast(Sum(CASE 
                                                 WHEN [type] = 0 THEN size 
                                               END) * 8. / 1024 AS 
                                           DECIMAL(18, 2)) 
                     , 
                     total_DB_size = Cast( 
                     Sum(size) * 8. / 1024 AS DECIMAL(18, 2)) 
              FROM   sys.master_files 
              GROUP  BY database_id) t 
             JOIN sys.databases d 
               ON d.database_id = t.database_id 
             LEFT JOIN #dbsize s 
                    ON d.database_id = s.database_id 
      ORDER  BY t.total_db_size DESC 
  END

Deuxièmement, créez des procédures stockées nommées Pull_Database_Objects dans les DBATools base de données. Cette procédure stockée parcourt toutes les bases de données des deux serveurs de base de données et remplit le nombre de tous les objets de base de données. Il renseigne les colonnes suivantes :

  1. Nom du serveur/hôte.
  2. Nom de la base de données.
  3. Type d'objet de base de données (Table / Procédure stockée / Fonctions SQL Scaler / Contraintes etc…)
  4. Nombre total d'objets de base de données.

Exécutez le code suivant dans DBATools base de données sur les deux serveurs de base de données pour créer la procédure stockée :

USE dbatools 
go 

CREATE PROCEDURE [Pull_database_objects] 
AS 
  BEGIN 
      CREATE TABLE #finalsummery 
        ( 
           id           INT IDENTITY (1, 1), 
           databasename VARCHAR(350), 
           objecttype   VARCHAR(200), 
           totalobjects INT 
        ) 

      DECLARE @SQLCommand NVARCHAR(max) 
      DECLARE @I INT=0 
      DECLARE @DBName VARCHAR(350) 
      DECLARE @DBCount INT 

      CREATE TABLE #databases 
        ( 
           NAME VARCHAR(350) 
        ) 

      INSERT INTO #databases 
                  (NAME) 
      SELECT NAME 
      FROM   sys.databases 
      WHERE  database_id > 4 
             AND NAME NOT IN ( 'ReportServer', 'reportservertempdb' ) 

      SET @DBCount=(SELECT Count(*) 
                    FROM   #databases) 

      WHILE ( @DBCount > @I ) 
        BEGIN 
            SET @DBName=(SELECT TOP 1 NAME 
                         FROM   #databases) 
            SET @SQLCommand='             Insert Into #FinalSummery (DatabaseName,ObjectType,TotalObjects)             Select              ''' + @DBName 
                            + ''',             Case                 when Type=''TR'' then ''SQL DML trigger''              when Type=''FN'' then ''SQL scalar function''              when Type=''D'' then ''DEFAULT (constraint or stand-alone)''              when Type=''PK'' then ''PRIMARY KEY constraint''              when Type=''P'' then ''SQL Stored Procedure''              when Type=''U'' then ''Table (user-defined)''              when Type=''V''  then ''View''              when Type=''X'' then ''Extended stored procedure''             End As ObjectType,              Count(Name)TotalObjects from ' + @DBName 
                            + '.sys.all_objects               group by type' 

            EXEC Sp_executesql 
              @SQLCommand 

            DELETE FROM #databases 
            WHERE  NAME = @DBName 

            SET @[email protected] + 1 
        END 

      SELECT Host_name() AS 'Server Name', 
             databasename, 
             objecttype, 
             totalobjects, 
             Getdate()   AS 'ReportDate' 
      FROM   #finalsummery 
      WHERE  objecttype IS NOT NULL 

      DROP TABLE #finalsummery 
  END

Créez des procédures stockées nommées Pull_SQLJob_Information dans les DBATools base de données. Cette procédure stockée parcourt tout le serveur de base de données et remplit les informations de tous les travaux SQL et leurs statuts. Il renseigne les colonnes suivantes :

  1. Nom du serveur/hôte.
  2. Nom de la tâche SQL.
  3. Propriétaire de la tâche SQL.
  4. Catégorie d'emploi.
  5. Description du travail.
  6. Statut de la tâche (activé/désactivé)
  7. Une date de création d'emploi.
  8. Date de modification du poste.
  9. Statut de la tâche planifiée.
  10. Nom de la planification.
  11. Date et heure de la dernière exécution
  12. État de la dernière exécution.

Exécutez le code suivant dans les DBATools base de données sur les deux serveurs de base de données pour créer la procédure stockée :

CREATE PROCEDURE Pull_sqljob_information 
AS 
  BEGIN 
      SELECT Host_name()       AS 'Server Name', 
             a.NAME            AS 'Job Name', 
             d.NAME            AS Owner, 
             b.NAME            AS Category, 
             a.description     AS Description, 
             CASE a.enabled 
               WHEN 1 THEN 'Yes' 
               WHEN 0 THEN 'No' 
             END               AS 'IsEnabled', 
             a.date_created    AS CreatedDate, 
             a.date_modified   AS ModifiedDate, 
             CASE 
               WHEN f.schedule_uid IS NULL THEN 'No' 
               ELSE 'Yes' 
             END               AS 'Scheduled?', 
             f.NAME            AS JobScheduleName, 
             Max(Cast( 
      Stuff(Stuff(Cast(g.run_date AS VARCHAR), 7, 0, '-'), 5, 0, '-') 
           + ' ' 
           + 
Stuff(Stuff(Replace(Str(g.run_time, 6, 0), ' ', '0'), 5, 0, ':'), 3, 0, ':') 
AS DATETIME)) AS [LastRun], 
CASE g.run_status 
WHEN 0 THEN 'Failed' 
WHEN 1 THEN 'Success' 
WHEN 2 THEN 'Retry' 
WHEN 3 THEN 'Canceled' 
WHEN 4 THEN 'In progress' 
END               AS Status 
FROM   msdb.dbo.sysjobs AS a 
       INNER JOIN msdb.dbo.sysjobhistory g 
               ON a.job_id = g.job_id 
       LEFT JOIN msdb.dbo.syscategories AS b 
              ON a.category_id = b.category_id 
       LEFT JOIN msdb.dbo.sysjobsteps AS c 
              ON a.job_id = c.job_id 
                 AND a.start_step_id = c.step_id 
       LEFT JOIN msdb.sys.database_principals AS d 
              ON a.owner_sid = d.sid 
       LEFT JOIN msdb.dbo.sysjobschedules AS e 
              ON a.job_id = e.job_id 
       LEFT JOIN msdb.dbo.sysschedules AS f 
              ON e.schedule_id = f.schedule_id 
GROUP  BY a.NAME, 
          d.NAME, 
          b.NAME, 
          a.description, 
          a.enabled, 
          f.schedule_uid, 
          f.NAME, 
          a.date_created, 
          a.date_modified, 
          g.run_status 
ORDER  BY a.NAME 
END

Créer des procédures stockées, un serveur lié et des tables sur le serveur central

Une fois les procédures créées sur le TTI609-VM1 et TTI609-VM2 serveurs de base de données, créez les procédures et les tables requises sur le serveur central (TTI412-VM ).

J'ai créé une base de données distincte nommée MonitoringDashboard sur le TTI412-VM serveur. Exécutez le code suivant pour créer une base de données sur le serveur central.

USE [master] 
go 

/****** Object:  Database [MonitoringDashboard]    Script Date: 10/25/2018 2:44:09 PM ******/ 

CREATE DATABASE [MonitoringDashboard] containment = none ON PRIMARY ( NAME = 
N'MonitoringDashboard', filename = 
N'E:\MS_SQL\SQL2017_Data\MonitoringDashboard.mdf', size = 8192kb, maxsize = 
unlimited, filegrowth = 65536kb ) log ON ( NAME = N'MonitoringDashboard_log', 
filename = N'E:\MS_SQL\SQL2017_Log\MonitoringDashboard_log.ldf', size = 8192kb, 
maxsize = 2048gb, filegrowth = 65536kb ) 

go

Une fois la base de données créée, créez une procédure stockée qui utilise LINKED Server pour exécuter une procédure sur le TTI609-VM1 et TTI609-VM2 serveurs de bases de données. Exécutez le code suivant dans la base de données "maître" du TTI412-VM serveur de base de données pour créer un serveur lié :

Script 1 :Créer un serveur lié TTI609-VM1

USE [master] 
go 
/****** Object:  LinkedServer [TTI609-VM1]    Script Date: 10/25/2018 2:49:28 PM ******/ 
EXEC master.dbo.Sp_addlinkedserver 
  @server = N'TTI609-VM1', 
  @srvproduct=N'SQL Server' 

/* For security reasons the linked server remote logins password is changed with ######## */ 
EXEC master.dbo.Sp_addlinkedsrvlogin 
  @rmtsrvname=N'TTI609-VM1', 
  @useself=N'False', 
  @locallogin=NULL, 
  @rmtuser=N'sa', 
  @rmtpassword='########' 

go 

EXEC master.dbo.Sp_serveroption 
  @server=N'TTI609-VM1', 
  @optname=N'collation compatible', 
  @optvalue=N'true' 

go 

EXEC master.dbo.Sp_serveroption 
  @server=N'TTI609-VM1', 
  @optname=N'data access', 
  @optvalue=N'true' 

go 

EXEC master.dbo.Sp_serveroption 
  @server=N'TTI609-VM1', 
  @optname=N'dist', 
  @optvalue=N'false' 

go 

EXEC master.dbo.Sp_serveroption 
  @server=N'TTI609-VM1', 
  @optname=N'rpc', 
  @optvalue=N'true' 

go 

EXEC master.dbo.Sp_serveroption 
  @server=N'TTI609-VM1', 
  @optname=N'rpc out', 
  @optvalue=N'true' 

go 

EXEC master.dbo.Sp_serveroption 
  @server=N'TTI609-VM1', 
  @optname=N'connect timeout', 
  @optvalue=N'0' 

go 

EXEC master.dbo.Sp_serveroption 
  @server=N'TTI609-VM1', 
  @optname=N'query timeout', 
  @optvalue=N'0' 

go 

EXEC master.dbo.Sp_serveroption 
  @server=N'TTI609-VM1', 
  @optname=N'use remote collation', 
  @optvalue=N'true' 

go 

EXEC master.dbo.Sp_serveroption 
  @server=N'TTI609-VM1', 
  @optname=N'remote proc transaction promotion', 
  @optvalue=N'false' 

go

Script 2 :Créer un serveur lié TTI609-VM2

USE [master] 

go 

/****** Object:  LinkedServer [TTI609-VM2]    Script Date: 10/25/2018 2:55:29 PM ******/ 
EXEC master.dbo.Sp_addlinkedserver 
  @server = N'TTI609-VM2', 
  @srvproduct=N'SQL Server' 

/* For security reasons the linked server remote logins password is changed with ######## */ 
EXEC master.dbo.Sp_addlinkedsrvlogin 
  @rmtsrvname=N'TTI609-VM2', 
  @useself=N'False', 
  @locallogin=NULL, 
  @rmtuser=N'sa', 
  @rmtpassword='########' 

go 

EXEC master.dbo.Sp_serveroption 
  @server=N'TTI609-VM2', 
  @optname=N'collation compatible', 
  @optvalue=N'true' 

go 

EXEC master.dbo.Sp_serveroption 
  @server=N'TTI609-VM2', 
  @optname=N'data access', 
  @optvalue=N'true' 

go 

EXEC master.dbo.Sp_serveroption 
  @server=N'TTI609-VM2', 
  @optname=N'dist', 
  @optvalue=N'false' 

go 

EXEC master.dbo.Sp_serveroption 
  @server=N'TTI609-VM2', 
  @optname=N'rpc', 
  @optvalue=N'true' 

go 

EXEC master.dbo.Sp_serveroption 
  @server=N'TTI609-VM2', 
  @optname=N'rpc out', 
  @optvalue=N'true' 

go 

EXEC master.dbo.Sp_serveroption 
  @server=N'TTI609-VM2', 
  @optname=N'connect timeout', 
  @optvalue=N'0' 

go 

EXEC master.dbo.Sp_serveroption 
  @server=N'TTI609-VM2', 
  @optname=N'collation name', 
  @optvalue=NULL 

go 

EXEC master.dbo.Sp_serveroption 
  @server=N'TTI609-VM2', 
  @optname=N'query timeout', 
  @optvalue=N'0' 

go 

EXEC master.dbo.Sp_serveroption 
  @server=N'TTI609-VM2', 
  @optname=N'use remote collation', 
  @optvalue=N'true' 

go 

EXEC master.dbo.Sp_serveroption 
  @server=N'TTI609-VM2', 
  @optname=N'remote proc transaction promotion', 
  @optvalue=N'false' 

go

Créer une procédure stockée et des tables

Une fois le serveur lié créé, nous devons créer trois tables nommées Database_Object_Summery , Database_Summery , et SQL_Job_List dans le MonitoringDashboard base de données. Ces tables stockent les informations renseignées par les Generate_Database_Information procédure stockée et plus tard les données, stockées dans ces tables qui seront utilisées pour générer un rapport dans Excel.

Exécutez le code suivant pour créer la SQL_Job_List tableau :

USE [MonitoringDashboard] 
go 

CREATE TABLE [dbo].[sql_job_list] 
  ( 
     [id]             [INT] IDENTITY(1, 1) NOT NULL, 
     [servername]     [VARCHAR](250) NULL, 
     [jobname]        [VARCHAR](250) NULL, 
     [jobowner]       [VARCHAR](250) NULL, 
     [jobcategory]    [VARCHAR](250) NULL, 
     [jobdescription] [VARCHAR](250) NULL, 
     [jobstatus]      [VARCHAR](50) NULL, 
     [createdate]     [DATETIME] NULL, 
     [modifieddate]   [DATETIME] NULL, 
     [isscheduled]    [VARCHAR](5) NULL, 
     [schedulename]   [VARCHAR](250) NULL, 
     [reportdate]     [DATETIME] NULL 
  ) 
ON [PRIMARY] 

go 

ALTER TABLE [dbo].[sql_job_list] 
  ADD DEFAULT (Getdate()) FOR [ReportDate] 

go

Exécutez le code suivant pour créer les lst_dbservers tableau :

USE [MonitoringDashboard] 

go 

CREATE TABLE [dbo].[lst_dbservers] 
  ( 
     [id]         [INT] IDENTITY(1, 1) NOT NULL, 
     [servername] [VARCHAR](50) NOT NULL, 
     [addeddate]  [DATETIME] NOT NULL, 
     PRIMARY KEY CLUSTERED ( [id] ASC )WITH (pad_index = OFF, 
     statistics_norecompute = OFF, ignore_dup_key = OFF, allow_row_locks = on, 
     allow_page_locks = on) ON [PRIMARY], 
     UNIQUE NONCLUSTERED ( [servername] ASC )WITH (pad_index = OFF, 
     statistics_norecompute = OFF, ignore_dup_key = OFF, allow_row_locks = on, 
     allow_page_locks = on) ON [PRIMARY] 
  ) 
ON [PRIMARY] 

go 

ALTER TABLE [dbo].[lst_dbservers] 
  ADD DEFAULT (Getdate()) FOR [AddedDate] 

go

Exécutez le code suivant pour créer la Database_Summery tableau :

USE [MonitoringDashboard] 
go 
CREATE TABLE [dbo].[database_summery] 
  ( 
     [id]                 [INT] IDENTITY(1, 1) NOT NULL, 
     [servername]         [VARCHAR](150) NULL, 
     [databaseid]         [INT] NULL, 
     [databasename]       [VARCHAR](250) NULL, 
     [databasestatus]     [VARCHAR](50) NULL, 
     [recoverymodel]      [VARCHAR](50) NULL, 
     [compatibilitylevel] [INT] NULL, 
     [databasecreatedate] [DATE] NULL, 
     [databasecreatedby]  [VARCHAR](150) NULL, 
     [dbsize]             [NUMERIC](10, 2) NULL, 
     [datafilesize]       [NUMERIC](10, 2) NULL, 
     [datafileused]       [NUMERIC](10, 2) NULL, 
     [logfilesize]        [NUMERIC](10, 2) NULL, 
     [logfileused]        [NUMERIC](10, 2) NULL, 
     [reportdate]         [DATETIME] NULL 
  ) 
ON [PRIMARY] 
go 

ALTER TABLE [dbo].[database_summery] 
  ADD DEFAULT (Getdate()) FOR [ReportDate] 
go

Exécutez le code suivant pour créer le Database_Object_Summery tableau :

USE [MonitoringDashboard] 

go 

CREATE TABLE [dbo].[database_object_summery] 
  ( 
     [id]           [INT] IDENTITY(1, 1) NOT NULL, 
     [servername]   [VARCHAR](250) NULL, 
     [databasename] [VARCHAR](250) NULL, 
     [objecttype]   [VARCHAR](50) NULL, 
     [objectcount]  [INT] NULL, 
     [reportdate]   [DATETIME] NULL 
  ) 
ON [PRIMARY] 

go 

ALTER TABLE [dbo].[database_object_summery] 
  ADD DEFAULT (Getdate()) FOR [ReportDate] 

go

Une fois les tables créées, créez une procédure stockée nommée Generate_Database_Information sur le MonitoringDashboard base de données. À l'aide de "RPC", il exécute des procédures stockées, créées sur le TTI609-VM1 et TTI609-VM2 serveurs de base de données pour remplir les données.

Exécutez le code suivant pour créer une procédure stockée :

Create PROCEDURE Generate_database_information 
AS 
  BEGIN 
      /*Cleanup*/ 
      TRUNCATE TABLE database_object_summery 
      TRUNCATE TABLE database_summery 
      TRUNCATE TABLE sql_job_list 

      DECLARE @ServerCount INT 
      DECLARE @i INT =0 
      DECLARE @SQLCommand_Object_Summery NVARCHAR(max) 
      DECLARE @SQLCommand_Database_Information NVARCHAR(max) 
      DECLARE @SQLCommand_SQL_Job_Information NVARCHAR(max) 
      DECLARE @servername VARCHAR(100) 

      CREATE TABLE #db_server_list 
        ( 
           servername VARCHAR(100) 
        ) 

      INSERT INTO #db_server_list 
                  (servername) 
      SELECT servername 
      FROM   lst_dbservers 

      SET @ServerCount= (SELECT Count(servername) 
                         FROM   #db_server_list) 

      WHILE ( @ServerCount > @i ) 
        BEGIN 
            SET @servername=(SELECT TOP 1 servername 
                             FROM   #db_server_list) 
            SET @SQLCommand_Object_Summery = 
'insert into Database_Object_Summery (ServerName,DatabaseName,ObjectType,ObjectCount,ReportDate) exec [' 
+ @servername 
+ '].DBATools.dbo.[Pull_Database_Objects]' 
    SET @SQLCommand_Database_Information = 
'insert into Database_Summery (ServerName,DatabaseID,DatabaseName,DatabaseStatus,Recoverymodel,CompatibilityLevel,DatabaseCreateDate,DatabaseCreatedBy,DBSize,DataFileSize,DataFileUsed,LogFileSize,LogFileUsed) exec [' 
+ @servername 
+ '].DBATools.dbo.[Pull_Database_Information]' 
    SET @SQLCommand_SQL_Job_Information = 
'insert into SQL_Job_List (ServerName,JobName,JobOwner,Jobcategory,JobDescription,JobStatus,CreateDate,ModifiedDate,IsScheduled,ScheduleName) exec [' 
+ @servername 
+ '].DBATools.dbo.[Pull_SQLJob_Information]' 

    EXEC Sp_executesql 
      @SQLCommand_Object_Summery 

    EXEC Sp_executesql 
      @SQLCommand_Database_Information 

    EXEC Sp_executesql 
      @SQLCommand_SQL_Job_Information 

    DELETE FROM #db_server_list 
    WHERE  servername = @servername 

    SET @[email protected] + 1 
END 
END

Une fois la procédure créée, créez un package SSIS pour exporter les données dans un fichier Excel.

Créer un package SSIS pour exporter des données dans un fichier Excel

Dans mes articles précédents, j'ai expliqué les étapes pour configurer les tâches de flux de données, les connexions OLEDB et les connexions Excel, donc j'ignore cette partie.

Pour exporter des données dans un fichier Excel, ouvrez les outils de données SQL Server et créez un nouveau projet SSIS nommé Export_Database_Information.

Une fois le projet créé, faites glisser et déposez Exécuter la tâche SQL au flux de contrôle fenêtre et renommez-la en tant que Remplir les données des serveurs . Voir l'image suivante :

Double-cliquez sur Exécuter la tâche SQL (Remplir les données du serveur). L'éditeur d'exécution de tâches SQL boîte de dialogue s'ouvre pour configurer la connexion SQL. Voir l'image suivante :

Dans la Connexion déposé, sélectionnez le OLEDB chaîne de connexion et dans la instruction SQL champ, fournissez la requête suivante :

USE monitoringdashboard 
go 
EXEC Generate_database_information

Cliquez sur OK pour fermer la boîte de dialogue.

Sur le flux de contrôle écran, faites glisser et déposez la tâche de flux de données depuis la boîte à outils SSIS et renommez-la en tant que Générer un rapport. Voir l'image suivante :

Double-cliquez pour ouvrir le flux de données fenêtre.

Comme je l'ai mentionné plus tôt, le Generate_Database_Information procédure insère la sortie des serveurs de base de données dans les tables suivantes :

  1. Database_Object_Summery
  2. Database_Summery
  3. SQL_Job_List

J'ai créé un fichier Excel contenant trois feuilles de calcul. Les tableaux suivants montrent le mappage des tables SQL et de la feuille de calcul Excel.


Dans le flux de données fenêtre, faites glisser et déposez trois sources ADO.Net et trois destinations Excel. Voir l'image suivante :

Double-cliquez sur Résumé d'objet y (Source ADO.NET) dans Source ADO.NET Éditeur.

  1. Sélectionnez TTI412-VM\SQL2017MonitoringDashboard depuis le gestionnaire de connexion ADO.NET liste déroulante.
  2. Sélectionnez Tableau ou Affichage depuis le mode d'accès aux données liste déroulante.
  3. Sélectionnez Database_Object_Summery de Nom de la table ou de la vue liste déroulante.

Double-cliquez sur Informations sur la base de données (Source ADO.NET) dans l'éditeur de source ADO.NET .

  1. Sélectionnez "TTI412-VM\SQL2017MonitoringDashboard ” du gestionnaire de connexion ADO.NET liste déroulante.
  2. Sélectionnez Tableau ou Affichage depuis le mode d'accès aux données liste déroulante.
  3. Sélectionnez "Database_Summery ” du Nom de la table ou de la vue liste déroulante.

Double-cliquez sur Tâches SQL (Source ADO.NET) dans l'éditeur de source ADO.NET .

  1. Sélectionnez TTI412-VM\SQL2017MonitoringDashboard dans le gestionnaire de connexions ADO.NET.
  2. Sélectionnez Tableau ou Affichage depuis le mode d'accès aux données liste déroulante.
  3. Sélectionnez SQL_Job_List dans le Nom de la table ou de la vue liste déroulante.

Maintenant, faites glisser et déposez trois destinations Excel à partir de la boîte à outils SSIS. Voir l'image suivante :

Une fois les destinations copiées, faites glisser la flèche bleue sous la source ADO.Net et déposez-la sur la destination Excel. Faites de même pour tous. Voir l'image suivante :

Double-cliquez sur Excel Object Summary (Source ADO.NET) dans l'éditeur de destination Excel .

  1. Sélectionnez Gestionnaire de connexion Excel depuis le gestionnaire de connexion Excel liste déroulante.
  2. Sélectionnez Table ou Afficher depuis le mode d'accès aux données liste déroulante.
  3. Sélectionnez Object Summery$ à partir du Nom de la feuille excel liste déroulante.

Comme je l'ai mentionné, les noms de colonne de la table SQL et des colonnes Excel sont identiques, donc le mappage sera effectué automatiquement. Cliquez sur Mappage pour mapper les colonnes. Voir l'image suivante :

Double-cliquez sur Informations sur la base de données Excel (Destination Excel) dans l'éditeur de destination Excel .

  1. Sélectionnez Gestionnaire de connexion Excel depuis le gestionnaire de connexion Excel liste déroulante.
  2. Sélectionnez Table ou Afficher depuis le mode d'accès aux données liste déroulante.
  3. Sélectionnez Informations sur la base de données$ à partir du Nom de la feuille excel liste déroulante.

Comme je l'ai mentionné, les noms de colonne de la table SQL et des colonnes Excel sont identiques, donc le mappage sera effectué automatiquement. Cliquez sur Mappage pour mapper les colonnes. Voir l'image suivante :

Double-cliquez sur Tâches SQL Excel (Destination Excel) dans l'éditeur de destination Excel .

  1. Sélectionnez Gestionnaire de connexion Excel depuis le gestionnaire de connexion Excel liste déroulante.
  2. Sélectionnez Table ou Afficher depuis le mode d'accès aux données liste déroulante.
  3. Sélectionnez « SQL Jobs$ dans le nom de la feuille Excel liste déroulante.

Comme je l'ai mentionné, les noms de colonne de la table SQL et des colonnes Excel sont identiques, donc le mappage sera effectué automatiquement. Cliquez sur Mappage pour mapper les colonnes. Voir l'image suivante :

Créer une tâche SQL pour envoyer le rapport de base de données par e-mail

Une fois le package créé, créez une tâche SQL pour effectuer les activités suivantes :

  1. Exécutez le package SSIS pour remplir les données de tous les serveurs.
  2. Envoyer le rapport de base de données par e-mail à l'équipe requise.

Dans SQL Job, nous devons créer deux étapes. La première étape exécutera le package SSIS et la deuxième étape exécutera la procédure d'envoi d'un e-mail.

Pour créer une tâche SQL, ouvrez SSMS>> SQL Server Agent>> Cliquez avec le bouton droit sur Nouvelle tâche SQL .

Om le nouveau travail assistant, sélectionnez l'étape option et cliquez sur Ne w. Dans l'étape Nouvelle tâche boîte de dialogue, dans l'étape nom zone de texte, indiquez le nom souhaité, sélectionnez package de services d'intégration SQL Server du Type boîte déroulante. Indiquez l'emplacement du package SSIS dans le Texte du package boîte. Voir l'image suivante :

Cliquez sur OK pour fermer Nouvelle étape de tâche .

Créez une autre étape de travail qui exécutera une procédure stockée pour envoyer le rapport par e-mail. Il utilise une procédure système pour envoyer un e-mail. Le package SSIS copie les informations de la base de données à un emplacement spécifique, donc fournissez le chemin complet du fichier Excel dans le paramètre @file_attachments de sp_send_dbmail procédure stockée.

Pour créer la procédure stockée, exécutez le code suivant dans DBATools base de données du serveur central :

CREATE PROCEDURE Send_database_report 
AS 
  BEGIN 
      DECLARE @ProfileName VARCHAR(150) 

      SET @ProfileName = (SELECT NAME 
                          FROM   msdb..sysmail_profile 
                          WHERE  profile_id = 7) 

      DECLARE @lsMessage NVARCHAR(max) 

      SET @lsMessage = '<p style="font-family:Arial; font-size:10pt">   Hello Support,   Please find attached database summery report.      ' + '</p>' 

      EXEC msdb.dbo.Sp_send_dbmail 
        @recipients='[email protected]', 
        @[email protected], 
        @subject='Database Summery Report', 
        @file_attachments= 
      'C:\Users\Administrator\Desktop\Database_Information.xlsx', 
        @copy_recipients='', 
        @blind_copy_recipients='', 
        @body_format='HTML', 
        @[email protected] 
  END

Once the procedure is created, add a new SQL Job étape. Click New . In the New Job Step dialog box, provide a Job Step name, and select Transact-SQL script (T-SQL) from the Type boîte déroulante. In the Command Text box, write the following code:

USE DBAtools 
Go 

EXEC Send_database_report

Voir l'image suivante :

Click OK to close the wizard. Now to configure Job Schedule , select Schedules on the New Job la fenêtre. Click New to add a schedule.

In the New Job Schedule dialog box, provide the desired name in the Name text box, choose frequency and time. Voir l'image suivante :

Close OK to close the New Job Schedule and in the New Job window, click on OK to close the dialog box.

Now, to test the SQL Job, right-click the Email Database Report SQL job and click Start Job at Step .

In the result of successful completion of the SQL Job, you will receive an email with the database report. Voir l'image suivante :

Résumé

In this article I have covered as follows:

  1. How to populate information of the databases located on remote DB server.
  2. Create an SSIS package to populate database information and export it to excel file
  3. Create a multi-step SQL job to generate the report by executing an SSIS package and email the report.