sql >> Database >  >> RDS >> Database

Automatisch e-mailsysteem om databaseoverzichtsrapport te verzenden

Databasebewaking is de meest essentiële taak van elke databasebeheerder. Grote organisaties en bedrijven hebben meerdere databaseservers die zich in hetzelfde datacenter of in de geografisch verschillende datacenters bevinden. Er zijn veel standaardtools voor databasemonitoring. Deze hulpprogramma's gebruiken de dynamische beheerweergaven van SQL Server en de door het systeem opgeslagen procedure om de gegevens te vullen. Met behulp van deze DMV's kunnen we ons aangepaste geautomatiseerde systeem maken om de status van de database te vullen en het rapport te e-mailen.

In dit artikel ga ik demonstreren hoe we de door het systeem opgeslagen procedure en de gekoppelde server kunnen gebruiken om de informatie van databases op verschillende servers te vullen en de taak te plannen om het rapport te verzenden.

In deze demo ga ik de volgende taken uitvoeren:

  1. Maak vereiste opgeslagen procedures op TTI609-VM1 , TTI609-VM2, en TTI412-VM servers om informatie over de database, database-objecten en SQL-taken in te vullen.
  2. Maak een opgeslagen procedure om de database-samenvatting, database-object-samenvatting en SQL Job-samenvatting in te vullen vanuit de TTI609-VM1 en TTI609-VM2 servers en sla ze op in gerelateerde tabellen.
  3. Maak een SSIS-pakket dat de volgende taken uitvoert:
      • Voert een opgeslagen procedure uit met behulp van SQL-scripttaak uitvoeren .
      • Gegevens exporteren uit SQL-tabellen die zijn gemaakt op TTI412-VM en sla het op in het individuele tabblad van een Excel-bestand.
  4. Maak een SQL Server-taak om het SSIS-pakket uit te voeren om de database-informatie en opgeslagen procedure te vullen om het rapport te e-mailen.

De volgende afbeelding illustreert de demo-opstelling:

Hieronder volgt de lijst met opgeslagen procedures:

Hieronder volgt de lijst met tabellen:

Opgeslagen procedures maken op beide databaseservers

Zoals ik al zei, gaan we gegevens invullen van de TTI609-VM1 en TTI609-VM2 servers. De opgeslagen procedures die worden gebruikt om de database te vullen, blijven op beide servers hetzelfde.
Dus ten eerste heb ik een database gemaakt met de naam DBATools op beide servers. Ik heb een opgeslagen procedure in die databases gemaakt. Voer hiervoor de volgende code uit op de TTI609-VM1 en TTI609-VM2 servers:

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

Maak een opgeslagen procedure met de naam Pull_Database_Information in de DBATools databank. Deze opgeslagen procedure vult de volgende informatie in van alle databases die op beide databaseservers bestaan.

  1. Databasenaam.
  2. Databasecompatibiliteitsniveau.
  3. Status van de database (ONLINE/OFFLINE/RESTORING/SUSPEND).
  4. Model voor databaseherstel (EENVOUDIG / VOLLEDIG / BULK-LOGGED).
  5. Databasegrootte in MB.
  6. Totale grootte van gegevensbestand.
  7. Gebruikte gegevensbestandsgrootte.
  8. Totale grootte van logbestand.
  9. Gebruikte logbestandsgrootte.

Voer de volgende code uit in de DBATools database van beide databaseservers om de opgeslagen procedure te maken:

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

Maak vervolgens opgeslagen procedures met de naam Pull_Database_Objects in de DBATools databank. Deze opgeslagen procedure doorloopt alle databases binnen beide databaseservers en vult de telling van alle databaseobjecten. Het vult de volgende kolommen:

  1. Server-/hostnaam.
  2. Databasenaam.
  3. Type database-object (Tabel / Opgeslagen procedure / SQL Scaler-functies / beperkingen enz...)
  4. Totaal aantal database-objecten.

Voer de volgende code uit in de DBATools database op beide databaseservers om de opgeslagen procedure te maken:

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

Maak opgeslagen procedures met de naam Pull_SQLJob_Information in de DBATools databank. Deze opgeslagen procedure doorloopt de hele databaseserver en vult de informatie van alle SQL-taken en hun statussen. Het vult de volgende kolommen:

  1. Server-/hostnaam.
  2. SQL-taaknaam.
  3. Eigenaar van SQL Job.
  4. Functiecategorie.
  5. Beschrijving van de taak.
  6. Status van taak (ingeschakeld/uitgeschakeld)
  7. Een datum waarop banen zijn gecreëerd.
  8. datum vacature gewijzigd.
  9. Taak geplande status.
  10. Naam planning.
  11. Laatste uitvoeringsdatum en -tijd
  12. Laatste uitvoeringsstatus.

Voer de volgende code uit in de DBATools database op beide databaseservers om de opgeslagen procedure te maken:

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

Maak opgeslagen procedures, gekoppelde server en tabellen op de centrale server

Nadat de procedures zijn gemaakt op de TTI609-VM1 en TTI609-VM2 databaseservers, maak de vereiste procedures en tabellen aan op de centrale server (TTI412-VM ).

Ik heb een aparte database gemaakt met de naam MonitoringDashboard op de TTI412-VM server. Voer de volgende code uit om een ​​database op de centrale server aan te maken.

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

Nadat de database is gemaakt, maakt u een opgeslagen procedure die LINKED Server gebruikt om een ​​procedure uit te voeren op de TTI609-VM1 en TTI609-VM2 database-servers. Voer de volgende code uit in de “master” database van de TTI412-VM databaseserver om een ​​gekoppelde server te maken:

Script 1:Maak gekoppelde server 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:Maak gekoppelde server 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

Maak een opgeslagen procedure en tabellen

Nadat de gekoppelde server is gemaakt, moeten we drie tabellen maken met de naam Database_Object_Summery , Database_Summery , en SQL_Job_List in het Bewakingsdashboard databank. In deze tabellen wordt informatie opgeslagen die wordt ingevuld door de Generate_Database_Information opgeslagen procedure en later de gegevens, opgeslagen in die tabellen die zullen worden gebruikt om een ​​rapport in Excel te genereren.

Voer de volgende code uit om de SQL_Job_List . te maken tafel:

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

Voer de volgende code uit om de lst_dbservers . te maken tafel:

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

Voer de volgende code uit om de Database_Summery . te maken tafel:

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

Voer de volgende code uit om de Database_Object_Summery . te maken tafel:

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

Nadat de tabellen zijn gemaakt, maakt u een opgeslagen procedure met de naam Generate_Database_Information op het Bewakingsdashboard databank. Met behulp van "RPC" voert het opgeslagen procedures uit, gemaakt op de TTI609-VM1 en TTI609-VM2 databaseservers om de gegevens te vullen.

Voer de volgende code uit om een ​​opgeslagen procedure te maken:

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

Nadat de procedure is gemaakt, maakt u een SSIS-pakket om gegevens naar een Excel-bestand te exporteren.

Maak SSIS-pakket om gegevens in Excel-bestand te exporteren

In mijn eerdere artikelen heb ik de stappen uitgelegd om de gegevensstroomtaken, OLEDB-verbindingen en Excel-verbindingen te configureren, daarom sla ik dit deel over.

Om gegevens naar een Excel-bestand te exporteren, opent u SQL Server Data-tools en maakt u een nieuw SSIS-project met de naam Export_Database_Information.

Zodra het project is gemaakt, slepen en neerzetten SQL-taak uitvoeren naar de Besturingsstroom venster en hernoem het als Gegevens invullen van servers . Zie de volgende afbeelding:

Dubbelklik op SQL-taak uitvoeren (Gegevens invullen vanaf server). De SQL-taakeditor uitvoeren dialoogvenster wordt geopend om de SQL-verbinding te configureren. Zie de volgende afbeelding:

In de Verbinding opgeslagen, selecteert u de OLEDB verbindingsreeks en in de SQL-instructie veld, geef de volgende vraag op:

USE monitoringdashboard 
go 
EXEC Generate_database_information

Klik op OK om het dialoogvenster te sluiten.

Op de Besturingsstroom scherm, sleept u Data Flow Task uit SSIS Toolbox en zet u deze neer en hernoemt u deze als Rapport genereren. Zie de volgende afbeelding:

Dubbelklik om deGegevensstroom . te openen venster.

Zoals ik eerder al zei, de Generate_Database_Information procedure voegt de uitvoer van de databaseservers in de volgende tabellen in:

  1. Database_Object_Summery
  2. Database_Summery
  3. SQL_Job_List

Ik heb een Excel-bestand gemaakt met drie werkbladen. De volgende tabellen tonen de toewijzing van de SQL-tabellen en het Excel-werkblad.


In de gegevensstroom venster, sleept u drie ADO.Net-bronnen en drie Excel-bestemmingen. Zie de volgende afbeelding:

Dubbelklik op Objectoverzicht y (ADO.NET Source) in ADO.NET Source Bewerker.

  1. Selecteer TTI412-VM\SQL2017MonitoringDashboard van de ADO.NET verbindingsbeheerder vervolgkeuzelijst.
  2. Selecteer Tabel of Weergave vanuit de Gegevenstoegangsmodus vervolgkeuzelijst.
  3. Selecteer Database_Object_Summery van Naam van de tabel of de weergave vervolgkeuzelijst.

Dubbelklik op Database-informatie (ADO.NET Source) in ADO.NET Source Editor .

  1. Selecteer "TTI412-VM\SQL2017MonitoringDashboard ” van de ADO.NET-verbindingsbeheerder vervolgkeuzelijst.
  2. Selecteer Tabel of Weergave vanuit de Gegevenstoegangsmodus vervolgkeuzelijst.
  3. Selecteer "Database_Summery ” van de Naam van de tabel of de weergave vervolgkeuzelijst.

Dubbelklik op SQL-taken (ADO.NET Source) in ADO.NET Source Editor .

  1. Selecteer TTI412-VM\SQL2017MonitoringDashboard in de ADO.NET verbindingsmanager.
  2. Selecteer Tabel of Weergave vanuit deGegevenstoegangsmodus vervolgkeuzelijst.
  3. Selecteer SQL_Job_List in de Naam van de tabel of de weergave vervolgkeuzelijst.

Sleep nu drie Excel-bestemmingen vanuit SSIS Toolbox. Zie de volgende afbeelding:

Nadat de bestemmingen zijn gekopieerd, sleept u de blauwe pijl onder de ADO.Net-bron en zet u deze neer op de Excel-bestemming. Doe hetzelfde voor iedereen. Zie de volgende afbeelding:

Dubbelklik op Excel-objectoverzicht (ADO.NET-bron) in Excel-bestemmingseditor .

  1. Selecteer Excel Verbindingsbeheer van de Excel-verbindingsbeheerder vervolgkeuzelijst.
  2. Selecteer Tin staat of Bekijk vanuit de Gegevenstoegangsmodus vervolgkeuzelijst.
  3. Selecteer Object Summery$ uit de Naam van het Excel-blad vervolgkeuzelijst.

Zoals ik al zei, zijn de kolomnamen van de SQL-tabel en de Excel-kolommen hetzelfde, dus het in kaart brengen wordt automatisch gedaan. Klik op Kaarten om de kolommen in kaart te brengen. Zie de volgende afbeelding:

Dubbelklik Excel-databasegegevens (Excel-bestemming) in Excel-bestemmingseditor .

  1. Selecteer Excel Verbindingsbeheer van de Excel-verbindingsbeheerder vervolgkeuzelijst.
  2. Selecteer Tin staat of Bekijk vanuit de Gegevenstoegangsmodus vervolgkeuzelijst.
  3. Selecteer Database-informatie$ uit de Naam van het Excel-blad vervolgkeuzelijst.

Zoals ik al zei, zijn de kolomnamen van de SQL-tabel en de Excel-kolommen hetzelfde, dus het in kaart brengen wordt automatisch gedaan. Klik op Kaarten om de kolommen in kaart te brengen. Zie de volgende afbeelding:

Dubbelklik op Excel SQL-taken (Excel-bestemming) in Excel-bestemmingseditor .

  1. Selecteer Excel Verbindingsbeheer van de Excel-verbindingsbeheerder vervolgkeuzelijst.
  2. Selecteer Tin staat of Bekijk vanuit de Gegevenstoegangsmodus vervolgkeuzelijst.
  3. Selecteer "SQL Jobs$ uit de naam van het Excel-blad vervolgkeuzelijst.

Zoals ik al zei, zijn de kolomnamen van de SQL-tabel en de Excel-kolommen hetzelfde, dus het in kaart brengen wordt automatisch gedaan. Klik op Kaarten om de kolommen in kaart te brengen. Zie de volgende afbeelding:

Maak een SQL-taak om het databaserapport te e-mailen

Nadat het pakket is gemaakt, maakt u een SQL-taak om de volgende activiteiten uit te voeren:

  1. Voer het SSIS-pakket uit om gegevens van alle servers te vullen.
  2. E-mail het databaserapport naar het vereiste team.

In SQL Job moeten we twee stappen maken. De eerste stap voert het SSIS-pakket uit en de tweede stap voert de procedure uit om een ​​e-mail te verzenden.

Om een ​​SQL-taak aan te maken, opent u SSMS>> SQL Server Agent>> Klik met de rechtermuisknop op Nieuwe SQL-taak .

Om de nieuwe baan wizard, selecteer de Stap optie en klik op Neen w. In de Nieuwe taakstap dialoogvenster, in de Stap naam tekstvak, geef de gewenste naam op, selecteer SQL Server Integration services-pakket van de Type vervolgkeuzelijst. Geef een locatie van het SSIS-pakket op in de Pakkettekst doos. Zie de volgende afbeelding:

Klik op OK om Nieuwe taakstap te sluiten .

Maak een andere taakstap die een opgeslagen procedure uitvoert om het rapport te e-mailen. Het gebruikt een systeemprocedure om een ​​e-mail te verzenden. Het SSIS-pakket kopieert de database-informatie naar een specifieke locatie, dus geef het volledige pad van het Excel-bestand op in de parameter @file_attachments van sp_send_dbmail opgeslagen procedure.

Om de opgeslagen procedure te maken, voert u de volgende code uit in de DBATools database van Central Server:

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 step. Click New . In the New Job Step dialog box, provide a Job Step name, and select Transact-SQL script (T-SQL) from the Type drop-down box. In the Command Text box, write the following code:

USE DBAtools 
Go 

EXEC Send_database_report

See the following image:

Click OK to close the wizard. Now to configure Job Schedule , select Schedules on the New Job raam. 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. See the following image:

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. See the following image:

Samenvatting

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.

  1. Entity Developer en ADO.Net Data Providers ondersteunen nu Entity Framework Core 5

  2. Hoe gefilterde indexen een krachtigere functie kunnen zijn

  3. Installeer en configureer XAMPP-software op Windows Server 2019

  4. MySQL 'user_id' in waar clausule dubbelzinnig probleem is