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 :
- 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.
- 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.
- 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.
- 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.
- Nom de la base de données.
- Niveau de compatibilité de la base de données.
- État de la base de données (ONLINE/OFFLINE/RESTORING/SUSPEND).
- Modèle de récupération de base de données (SIMPLE / FULL / BULK-LOGGED).
- Taille de la base de données en Mo.
- Taille totale du fichier de données.
- Taille du fichier de données utilisé.
- Taille totale du fichier journal.
- 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 :
- Nom du serveur/hôte.
- Nom de la base de données.
- Type d'objet de base de données (Table / Procédure stockée / Fonctions SQL Scaler / Contraintes etc…)
- 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 :
- Nom du serveur/hôte.
- Nom de la tâche SQL.
- Propriétaire de la tâche SQL.
- Catégorie d'emploi.
- Description du travail.
- Statut de la tâche (activé/désactivé)
- Une date de création d'emploi.
- Date de modification du poste.
- Statut de la tâche planifiée.
- Nom de la planification.
- Date et heure de la dernière exécution
- É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 :
- Database_Object_Summery
- Database_Summery
- 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.
- Sélectionnez TTI412-VM\SQL2017MonitoringDashboard depuis le gestionnaire de connexion ADO.NET liste déroulante.
- Sélectionnez Tableau ou Affichage depuis le mode d'accès aux données liste déroulante.
- 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 .
- Sélectionnez "TTI412-VM\SQL2017MonitoringDashboard ” du gestionnaire de connexion ADO.NET liste déroulante.
- Sélectionnez Tableau ou Affichage depuis le mode d'accès aux données liste déroulante.
- 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 .
- Sélectionnez TTI412-VM\SQL2017MonitoringDashboard dans le gestionnaire de connexions ADO.NET.
- Sélectionnez Tableau ou Affichage depuis le mode d'accès aux données liste déroulante.
- 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 .
- Sélectionnez Gestionnaire de connexion Excel depuis le gestionnaire de connexion Excel liste déroulante.
- Sélectionnez Table ou Afficher depuis le mode d'accès aux données liste déroulante.
- 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 .
- Sélectionnez Gestionnaire de connexion Excel depuis le gestionnaire de connexion Excel liste déroulante.
- Sélectionnez Table ou Afficher depuis le mode d'accès aux données liste déroulante.
- 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 .
- Sélectionnez Gestionnaire de connexion Excel depuis le gestionnaire de connexion Excel liste déroulante.
- Sélectionnez Table ou Afficher depuis le mode d'accès aux données liste déroulante.
- 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 :
- Exécutez le package SSIS pour remplir les données de tous les serveurs.
- 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:
- How to populate information of the databases located on remote DB server.
- Create an SSIS package to populate database information and export it to excel file
- Create a multi-step SQL job to generate the report by executing an SSIS package and email the report.