Database
 sql >> Baza danych >  >> RDS >> Database

System automatycznej poczty e-mail do wysyłania raportu podsumowującego bazy danych

Monitorowanie bazy danych to najważniejsza praca każdego administratora bazy danych. Duże organizacje i firmy mają wiele serwerów baz danych, które znajdują się w tym samym centrum danych lub w geograficznie różnych centrach danych. Istnieje wiele standardowych narzędzi do monitorowania baz danych. Narzędzia te wykorzystują widoki zarządzania dynamicznego programu SQL Server i systemową procedurę składowaną do wypełniania danych. Korzystając z tych DMV, możemy stworzyć nasz dostosowany zautomatyzowany system do wypełniania stanu bazy danych i wysyłania raportu pocztą e-mail.

W tym artykule zademonstruję, w jaki sposób możemy użyć systemowej procedury składowanej i połączonego serwera, aby wypełnić informacje o bazach danych znajdujących się na różnych serwerach i zaplanować zadanie wysłania raportu.

W tym demo wykonam następujące zadania:

  1. Utwórz wymagane procedury składowane na TTI609-VM1 , TTI609-VM2, i TTI412-VM serwery do wypełniania informacji o bazie danych, obiektach bazy danych i zadaniach SQL.
  2. Utwórz procedurę składowaną, aby wypełnić podsumowanie bazy danych, podsumowanie obiektu bazy danych i podsumowanie zadania SQL z TTI609-VM1 i TTI609-VM2 serwerów i przechowuj je w powiązanych tabelach.
  3. Utwórz pakiet SSIS, który wykonuje następujące zadania:
      • Wykonuje procedurę składowaną za pomocą Wykonaj zadanie skryptu SQL .
      • Eksportuj dane z tabel SQL utworzonych na TTI412-VM i przechowuj go w indywidualnej zakładce pliku Excel.
  4. Utwórz zadanie SQL Server, aby wykonać pakiet SSIS w celu wypełnienia informacji o bazie danych i procedury składowanej w celu wysłania raportu pocztą e-mail.

Poniższy obraz ilustruje konfigurację demonstracyjną:

Poniżej znajduje się lista procedur składowanych:

Poniżej znajduje się lista tabel:

Utwórz procedury składowane na obu serwerach baz danych

Jak wspomniałem, zamierzamy wypełnić dane z TTI609-VM1 i TTI609-VM2 serwery. Procedury składowane używane do wypełniania bazy danych pozostaną takie same na obu serwerach.
Po pierwsze stworzyłem bazę danych o nazwie DBATools na obu serwerach. W tych bazach danych utworzyłem procedurę składowaną. Aby to zrobić, wykonaj następujący kod na TTI609-VM1 i TTI609-VM2 serwery:

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

Utwórz procedurę składowaną o nazwie Pull_Database_Information w Narzędziach DBA Baza danych. Ta procedura składowana wypełnia następujące informacje o wszystkich bazach danych istniejących na obu serwerach baz danych.

  1. Nazwa bazy danych.
  2. Poziom zgodności bazy danych.
  3. Stan bazy danych (ONLINE/OFFLINE/PRZYWRACANIE/ZAWIESZENIE).
  4. Model odzyskiwania bazy danych (PROSTY / PEŁNY / BULK-LOGGED).
  5. Rozmiar bazy danych w MB.
  6. Całkowity rozmiar pliku danych.
  7. Używany rozmiar pliku danych.
  8. Całkowity rozmiar pliku dziennika.
  9. Używany rozmiar pliku dziennika.

Wykonaj następujący kod w DBATools baza danych obu serwerów baz danych do utworzenia procedury składowanej:

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

Po drugie, utwórz procedury składowane o nazwie Pull_Database_Objects w Narzędziach DBA Baza danych. Ta procedura składowana przechodzi przez wszystkie bazy danych na obu serwerach baz danych i wypełnia liczbę wszystkich obiektów bazy danych. Wypełnia następujące kolumny:

  1. Nazwa serwera/hosta.
  2. Nazwa bazy danych.
  3. Typ obiektu bazy danych (tabela / procedura składowana / funkcje skalowania SQL / ograniczenia itp.)
  4. Całkowita liczba obiektów bazy danych.

Wykonaj następujący kod w DBATools bazy danych na obu serwerach baz danych, aby utworzyć procedurę składowaną:

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

Utwórz procedury składowane o nazwie Pull_SQLJob_Information w Narzędziach DBA Baza danych. Ta procedura składowana przechodzi przez cały serwer bazy danych i wypełnia informacje o wszystkich zadaniach SQL i ich statusach. Wypełnia następujące kolumny:

  1. Nazwa serwera/hosta.
  2. Nazwa zadania SQL.
  3. Właściciel zadania SQL.
  4. Kategoria pracy.
  5. Opis pracy.
  6. Stan zadania (włączony / wyłączony)
  7. Data utworzenia pracy.
  8. Data modyfikacji zadania.
  9. Stan zaplanowanego zadania.
  10. Nazwa harmonogramu.
  11. Data i godzina ostatniego wykonania
  12. Status ostatniego wykonania.

Wykonaj następujący kod w DBATools bazy danych na obu serwerach baz danych, aby utworzyć procedurę składowaną:

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

Utwórz procedury składowane, serwer połączony i tabele na serwerze centralnym

Po utworzeniu procedur na TTI609-VM1 i TTI609-VM2 serwery baz danych, utwórz wymagane procedury i tabele na serwerze centralnym (TTI412-VM ).

Utworzyłem osobną bazę danych o nazwie Panel monitorowania na TTI412-VM serwer. Wykonaj następujący kod, aby utworzyć bazę danych na centralnym serwerze.

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

Po utworzeniu bazy danych utwórz procedurę składowaną, która używa serwera LINKED do wykonania procedury na TTI609-VM1 i TTI609-VM2 serwery baz danych. Wykonaj następujący kod w „głównej” bazie danych TTI412-VM serwer bazy danych do utworzenia serwera połączonego:

Skrypt 1:Utwórz połączony serwer 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

Skrypt 2:Utwórz połączony serwer 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

Utwórz procedurę składowaną i tabele

Po utworzeniu połączonego serwera musimy utworzyć trzy tabele o nazwie Database_Object_Sumery , Baza danych_summer i SQL_Job_List w Panelu monitorowania Baza danych. Te tabele przechowują informacje wypełniane przez Generate_Database_Information procedura składowana, a później dane przechowywane w tych tabelach, które zostaną użyte do wygenerowania raportu w programie Excel.

Wykonaj następujący kod, aby utworzyć SQL_Job_List tabela:

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

Wykonaj następujący kod, aby utworzyć lst_dbservers tabela:

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

Wykonaj następujący kod, aby utworzyć Database_Sumery tabela:

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

Wykonaj następujący kod, aby utworzyć Database_Object_Sumery tabela:

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

Po utworzeniu tabel utwórz procedurę składowaną o nazwie Generate_Database_Information na Panelu monitorowania Baza danych. Za pomocą „RPC” wykonuje procedury składowane utworzone na TTI609-VM1 i TTI609-VM2 serwery baz danych do wypełnienia danych.

Wykonaj następujący kod, aby utworzyć procedurę składowaną:

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

Po utworzeniu procedury utwórz pakiet SSIS, aby wyeksportować dane do pliku Excel.

Utwórz pakiet SSIS, aby wyeksportować dane w pliku Excel

W moich poprzednich artykułach wyjaśniłem kroki konfiguracji zadań przepływu danych, połączeń OLEDB i połączeń Excela, dlatego pominąłem tę część.

Aby wyeksportować dane do pliku Excel, otwórz narzędzia SQL Server Data i utwórz nowy projekt SSIS o nazwie Export_Database_Information.

Po utworzeniu projektu przeciągnij i upuść Wykonaj zadanie SQL do Przepływu sterowania i zmień jego nazwę na Wypełnij dane z serwerów . Zobacz następujący obraz:

Kliknij dwukrotnie Wykonaj zadanie SQL (Wypełnij dane z serwera). Wykonaj edytor zadań SQL otworzy się okno dialogowe konfiguracji połączenia SQL. Zobacz następujący obraz:

W Połączeniu złożony, wybierz OLEDB parametry połączenia oraz w instrukcji SQL wpisz następujące zapytanie:

USE monitoringdashboard 
go 
EXEC Generate_database_information

Kliknij OK, aby zamknąć okno dialogowe.

W przepływie kontroli przeciągnij i upuść zadanie przepływu danych z programu SSIS Toolbox i zmień jego nazwę na Generuj raport. Zobacz następujący obraz:

Kliknij dwukrotnie, aby otworzyćprzepływ danych okno.

Jak wspomniałem wcześniej, Generate_Database_Information procedura wstawia dane wyjściowe serwerów bazy danych do następujących tabel:

  1. Database_Object_Summer
  2. Baza danych_lato
  3. SQL_Job_List

Stworzyłem plik Excela, który zawiera trzy arkusze. Poniższe tabele pokazują mapowanie tabel SQL i arkusza Excel.


W przepływie danych przeciągnij i upuść trzy źródła ADO.Net i trzy miejsca docelowe Excela. Zobacz następujący obraz:

Kliknij dwukrotnie Podsumowanie obiektu y (źródło ADO.NET) w Źródle ADO.NET Redaktor.

  1. Wybierz TTI412-VM\SQL2017MonitoringDashboard z menedżera połączeń ADO.NET rozwijane pole.
  2. Wybierz Tabela lub Widok z trybu dostępu do danych rozwijane pole.
  3. Wybierz Database_Object_Summer z Nazwa tabeli lub widoku rozwijane pole.

Kliknij dwukrotnie Informacje o bazie danych (Źródło ADO.NET) w Edytorze źródeł ADO.NET .

  1. Wybierz „TTI412-VM\SQL2017MonitoringDashboard ” z menedżera połączeń ADO.NET rozwijane pole.
  2. Wybierz Tabela lub Widok z trybu dostępu do danych rozwijane pole.
  3. Wybierz „Baza_danych ” z Nazwy tabeli lub widoku rozwijane pole.

Kliknij dwukrotnie Zadania SQL (Źródło ADO.NET) w Edytorze źródeł ADO.NET .

  1. Wybierz TTI412-VM\SQL2017MonitoringDashboard w menedżerze połączeń ADO.NET.
  2. Wybierz Tabela lub Widok z trybu dostępu do danych rozwijane pole.
  3. Wybierz SQL_Job_List w Nazwie tabeli lub widoku rozwijane pole.

Teraz przeciągnij i upuść trzy miejsca docelowe programu Excel z zestawu narzędzi SSIS. Zobacz następujący obraz:

Po skopiowaniu miejsc docelowych przeciągnij niebieską strzałkę pod źródło ADO.Net i upuść ją w miejscu docelowym programu Excel. Zrób to samo dla wszystkich. Zobacz następujący obraz:

Kliknij dwukrotnie Podsumowanie obiektu Excela (Źródło ADO.NET) w Edytorze docelowym programu Excel .

  1. Wybierz Menedżera połączeń Excel z menedżera połączeń programu Excel rozwijane pole.
  2. Wybierz Tmożliwe lub Widok z trybu dostępu do danych rozwijane pole.
  3. Wybierz Obiekt Summery$ zNazwa arkusza programu Excel rozwijane pole.

Jak wspomniałem, nazwy kolumn tabeli SQL i kolumn Excela są takie same, dlatego mapowanie zostanie wykonane automatycznie. Kliknij Mapowanie aby zmapować kolumny. Zobacz następujący obraz:

Kliknij dwukrotnie Informacje o bazie danych programu Excel (Miejsce docelowe programu Excel) w Edytorze miejsca docelowego programu Excel .

  1. Wybierz Menedżera połączeń Excel z menedżera połączeń programu Excel rozwijane pole.
  2. Wybierz Tmożliwe lub Widok z trybu dostępu do danych rozwijane pole.
  3. Wybierz Informacje o bazie danych$ zNazwa arkusza programu Excel rozwijane pole.

Jak wspomniałem, nazwy kolumn tabeli SQL i kolumn Excela są takie same, dlatego mapowanie zostanie wykonane automatycznie. Kliknij Mapowanie aby zmapować kolumny. Zobacz następujący obraz:

Kliknij dwukrotnie Zadania Excel SQL (Miejsce docelowe programu Excel) w Edytorze miejsca docelowego programu Excel .

  1. Wybierz Menedżera połączeń Excel z menedżera połączeń programu Excel rozwijane pole.
  2. Wybierz Tmożliwe lub Widok z trybu dostępu do danych rozwijane pole.
  3. Wybierz „Zadania SQL$ zNazwa arkusza Excel rozwijane pole.

Jak wspomniałem, nazwy kolumn tabeli SQL i kolumn Excela są takie same, dlatego mapowanie zostanie wykonane automatycznie. Kliknij Mapowanie aby zmapować kolumny. Zobacz następujący obraz:

Utwórz zadanie SQL, aby wysłać raport bazy danych pocztą elektroniczną

Po utworzeniu pakietu utwórz zadanie SQL, aby wykonać następujące czynności:

  1. Wykonaj pakiet SSIS, aby wypełnić dane ze wszystkich serwerów.
  2. Wyślij e-mailem raport bazy danych do wymaganego zespołu.

W SQL Job musimy stworzyć dwa kroki. Pierwszy krok uruchomi pakiet SSIS, a drugi krok wykona procedurę wysłania wiadomości e-mail.

Aby utworzyć zadanie SQL, otwórz SSMS>> SQL Server Agent>> Kliknij prawym przyciskiem myszy Nowe zadanie SQL .

O nowej pracy kreatora, wybierz Krok opcję i kliknij Ne w. W kroku Nowa praca okno dialogowe, w kroku nazwa pole tekstowe, podaj żądaną nazwę, wybierz Pakiet usług integracji SQL Server z Typu upuścić pudło. Podaj lokalizację pakietu SSIS w Tekście pakietu skrzynka. Zobacz następujący obraz:

Kliknij OK, aby zamknąć Krok nowej oferty .

Utwórz kolejny krok zadania, który wykona procedurę składowaną w celu wysłania raportu pocztą e-mail. Wykorzystuje procedurę systemową do wysyłania wiadomości e-mail. Pakiet SSIS kopiuje informacje z bazy danych w określonej lokalizacji, dlatego należy podać pełną ścieżkę do pliku programu Excel w parametrze @file_attachments sp_send_dbmail procedura składowana.

Aby utworzyć procedurę składowaną, wykonaj następujący kod w DBATools baza danych Serwera Centralnego:

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 upuścić pudło. In the Command Text box, write the following code:

USE DBAtools 
Go 

EXEC Send_database_report

Zobacz następujący obraz:

Click OK to close the wizard. Now to configure Job Schedule , select Schedules on the New Job window. 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. Zobacz następujący obraz:

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. Zobacz następujący obraz:

Podsumowanie

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Uszkodzenie bazy danych

  2. Pakiet hostingowy na Chocolatey

  3. Jak usunąć początkowe i/lub końcowe spacje ciągu w T-SQL

  4. Instrukcja SQL INSERT INTO

  5. Testowanie obciążenia sieciowego za pomocą iPerf