sql >> Databáze >  >> RDS >> Database

Systém automatického e-mailu pro odeslání souhrnné zprávy databáze

Monitorování databáze je nejdůležitější prací každého správce databáze. Velké organizace a společnosti mají více databázových serverů, které jsou umístěny buď ve stejném datovém centru, nebo v geograficky odlišných datových centrech. Pro monitorování databáze existuje mnoho standardních nástrojů. Tyto nástroje používají k naplnění dat pohledy dynamické správy serveru SQL Server a systémovou uloženou proceduru. Pomocí těchto DMV můžeme vytvořit náš přizpůsobený automatizovaný systém pro naplnění stavu databáze a odeslání zprávy e-mailem.

V tomto článku předvedu, jak můžeme použít systémovou uloženou proceduru a propojený server k naplnění informací databází umístěných na různých serverech a naplánování úlohy k odeslání zprávy.

V této ukázce budu provádět následující úkoly:

  1. Vytvořte požadované uložené procedury na TTI609-VM1 , TTI609-VM2, a TTI412-VM servery k naplnění informací o databázi, databázových objektech a úlohách SQL.
  2. Vytvořte uloženou proceduru pro naplnění souhrnu databáze, souhrnu databázových objektů a souhrnu úlohy SQL z TTI609-VM1 a TTI609-VM2 servery a ukládat je do souvisejících tabulek.
  3. Vytvořte balíček SSIS, který bude provádět následující úkoly:
      • Spustí uloženou proceduru pomocí Spustit úlohu skriptu SQL .
      • Exportujte data z tabulek SQL vytvořených na TTI412-VM a uložte jej na samostatnou kartu souboru aplikace Excel.
  4. Vytvořte úlohu serveru SQL pro spuštění balíčku SSIS k naplnění informací o databázi a uložené procedury pro odeslání zprávy e-mailem.

Následující obrázek ilustruje nastavení ukázky:

Následuje seznam uložených procedur:

Následuje seznam tabulek:

Vytvoření uložených procedur na obou databázových serverech

Jak jsem zmínil, chystáme se naplnit data z TTI609-VM1 a TTI609-VM2 servery. Uložené procedury používané k naplnění databáze zůstanou na obou serverech stejné.
Takže nejprve jsem vytvořil databázi s názvem DBATools na obou serverech. V těchto databázích jsem vytvořil uloženou proceduru. Chcete-li to provést, spusťte následující kód na TTI609-VM1 a TTI609-VM2 servery:

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

Vytvořte uloženou proceduru s názvem Pull_Database_Information v DBATools databáze. Tato uložená procedura vyplní následující informace o všech databázích existujících na obou databázových serverech.

  1. Název databáze.
  2. Úroveň kompatibility databáze.
  3. Stav databáze (ONLINE/OFFLINE/OBNOVA/POZASTAVENÍ).
  4. Model obnovy databáze (JEDNODUCHO / ÚPLNÁ / HROMADNĚ PROTOKOVANÉ).
  5. Velikost databáze v MB.
  6. Celková velikost datového souboru.
  7. Použitá velikost datového souboru.
  8. Celková velikost souboru protokolu.
  9. Použitá velikost souboru protokolu.

Spusťte následující kód vDBATools databáze obou databázových serverů pro vytvoření uložené procedury:

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

Za druhé, vytvořte uložené procedury s názvem Pull_Database_Objects v DBATools databáze. Tato uložená procedura prochází všemi databázemi v rámci obou databázových serverů a naplňuje počet všech databázových objektů. Vyplní následující sloupce:

  1. Název serveru / hostitele.
  2. Název databáze.
  3. Typ databázového objektu (tabulka / uložená procedura / funkce SQL Scaler / omezení atd...)
  4. Celkový počet databázových objektů.

Spusťte následující kód v DBATools databáze na obou databázových serverech k vytvoření uložené procedury:

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

Vytvořte uložené procedury s názvem Pull_SQLJob_Information v DBATools databáze. Tato uložená procedura prochází celým databázovým serverem a naplňuje informace o všech úlohách SQL a jejich stavech. Vyplní následující sloupce:

  1. Název serveru / hostitele.
  2. Název úlohy SQL.
  3. Vlastník úlohy SQL.
  4. Kategorie práce.
  5. Popis úlohy.
  6. Stav úlohy (povoleno / zakázáno)
  7. Datum vytvoření pracovního místa.
  8. Datum změny úkolu.
  9. Stav naplánované úlohy.
  10. Název plánu.
  11. Datum a čas posledního provedení
  12. Stav posledního provedení.

Spusťte následující kód vDBATools databáze na obou databázových serverech k vytvoření uložené procedury:

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

Vytvářejte uložené procedury, propojený server a tabulky na centrálním serveru

Jakmile budou postupy vytvořeny na TTI609-VM1 a TTI609-VM2 databázové servery, vytvořte požadované procedury a tabulky na centrálním serveru (TTI412-VM ).

Vytvořil jsem samostatnou databázi s názvem MonitoringDashboard na TTI412-VM server. Spuštěním následujícího kódu vytvořte databázi na centrálním serveru.

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 vytvoření databáze vytvořte uloženou proceduru, která používá LINKED Server ke spuštění procedury na TTI609-VM1 a TTI609-VM2 databázové servery. Spusťte následující kód v „hlavní“ databázi TTI412-VM databázový server pro vytvoření propojeného serveru:

Skript 1:Vytvořte propojený 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

Skript 2:Vytvořte propojený 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

Vytvořte uloženou proceduru a tabulky

Po vytvoření propojeného serveru musíme vytvořit tři tabulky s názvem Database_Object_Summery , Database_Summery a SQL_Job_List v MonitoringDashboard databáze. Tyto tabulky ukládají informace naplněné Generate_Database_Information uložená procedura a později data uložená v těchto tabulkách, které budou použity pro generování sestavy v excelu.

Spuštěním následujícího kódu vytvořte SQL_Job_List tabulka:

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

Spuštěním následujícího kódu vytvořte lst_dbservers tabulka:

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

Spuštěním následujícího kódu vytvořte Database_Summery tabulka:

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

Spuštěním následujícího kódu vytvořte Database_Object_Summery tabulka:

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 vytvoření tabulek vytvořte uloženou proceduru s názvem Generate_Database_Information na MonitoringDashboard databáze. Pomocí „RPC“ provádí uložené procedury vytvořené naTTI609-VM1 a TTI609-VM2 databázové servery k naplnění dat.

Chcete-li vytvořit uloženou proceduru, spusťte následující kód:

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 vytvoření procedury vytvořte balíček SSIS pro export dat do souboru aplikace Excel.

Vytvořte balíček SSIS pro export dat do souboru aplikace Excel

Ve svých minulých článcích jsem vysvětlil kroky ke konfiguraci úloh toku dat, připojení OLEDB a připojení aplikace Excel, proto tuto část přeskakuji.

Chcete-li exportovat data do souboru aplikace Excel, otevřete nástroje SQL Server Data Tools a vytvořte nový projekt SSIS s názvem Export_Database_Information.

Jakmile je projekt vytvořen, přetáhněte Spustit úlohu SQL do Toku řízení okno a přejmenujte jej na Naplnit data ze serverů . Viz následující obrázek:

Poklepejte na Spustit úlohu SQL (Naplnit data ze serveru). Spustit editor úloh SQL otevře se dialogové okno pro konfiguraci připojení SQL. Viz následující obrázek:

V části Připojení vyberte OLEDB připojovací řetězec a v příkazu SQL zadejte následující dotaz:

USE monitoringdashboard 
go 
EXEC Generate_database_information

Klepnutím na tlačítko OK zavřete dialogové okno.

Na Toku ovládání přetáhněte úlohu Data Flow Task z SSIS Toolbox a přejmenujte ji na Generate Report. Viz následující obrázek:

Dvojitým kliknutím otevřete Datový tok okno.

Jak jsem již zmínil, Generate_Database_Information procedura vloží výstup databázových serverů do následujících tabulek:

  1. Database_Object_Summery
  2. Databáze_Léto
  3. SQL_Job_List

Vytvořil jsem soubor Excel, který má tři listy. Následující tabulky ukazují mapování tabulek SQL a Excel Worksheet.


V Datovém toku okno, přetáhněte tři zdroje ADO.Net a tři cíle Excel. Viz následující obrázek:

Dvakrát klikněte na Souhrn objektů y (zdroj ADO.NET) v Zdroj ADO.NET Editor.

  1. Vyberte TTI412-VM\SQL2017MonitoringDashboard ze Správce připojení ADO.NET rozevíracím seznamu.
  2. Vyberte Tabulka nebo Zobrazit z režimu přístupu k datům rozevíracím seznamu.
  3. Vyberte Database_Object_Summery z Název tabulky nebo zobrazení rozevíracím seznamu.

Dvakrát klikněte na Informace o databázi (zdroj ADO.NET) v Editoru zdrojů ADO.NET .

  1. Vyberte „TTI412-VM\SQL2017MonitoringDashboard ” ze Správce připojení ADO.NET rozevíracím seznamu.
  2. Vyberte Tabulka nebo Zobrazit z režimu přístupu k datům rozevíracího pole.
  3. Vyberte „Database_Summery ” z Název tabulky nebo zobrazení rozevíracího pole.

Poklepejte na Úlohy SQL (zdroj ADO.NET) v Editoru zdrojů ADO.NET .

  1. Vyberte TTI412-VM\SQL2017MonitoringDashboard ve správci připojení ADO.NET.
  2. Vyberte Tabulka nebo Zobrazit zrežimu přístupu k datům rozevíracího pole.
  3. Vyberte SQL_Job_List v Název tabulky nebo zobrazení rozevíracího pole.

Nyní přetáhněte tři cíle aplikace Excel z panelu nástrojů SSIS. Viz následující obrázek:

Po zkopírování cílů přetáhněte modrou šipku pod zdroj ADO.Net a umístěte jej do cíle aplikace Excel. Udělejte totéž pro všechny. Viz následující obrázek:

Poklepejte na Shrnutí objektů Excel (zdroj ADO.NET) vEditoru cílů Excelu .

  1. Vyberte Excel Connection Manager ze Správce připojení aplikace Excel rozevíracího pole.
  2. Vyberte možnost Table nebo View z režimu přístupu k datům rozevíracím seznamu.
  3. Vyberte Object Summery$ zNázev excelového listu rozevíracího pole.

Jak jsem zmínil, názvy sloupců tabulky SQL a sloupců Excelu jsou stejné, takže mapování bude provedeno automaticky. Klikněte na Mapování k mapování sloupců. Viz následující obrázek:

Poklepejte na Informace o databázi Excel (Cíl v Excelu) v Editoru cílů Excelu .

  1. Vyberte Excel Connection Manager ze Správce připojení aplikace Excel rozevíracího pole.
  2. Vyberte možnost Table nebo View z režimu přístupu k datům rozevíracím seznamu.
  3. Vyberte Informace o databázi$ zNázev excelového listu rozevíracím seznamu.

Jak jsem zmínil, názvy sloupců tabulky SQL a sloupců Excelu jsou stejné, takže mapování bude provedeno automaticky. Klikněte na Mapování k mapování sloupců. Viz následující obrázek:

Poklepejte na Excel SQL Jobs (Cíl v Excelu) vEditoru cílů Excelu .

  1. Vyberte Excel Connection Manager ze Správce připojení aplikace Excel rozevíracího pole.
  2. Vyberte možnost Table nebo View z režimu přístupu k datům rozevíracím seznamu.
  3. Z Název listu Excelu vyberte „Úlohy SQL$“. rozevíracího pole.

Jak jsem zmínil, názvy sloupců tabulky SQL a sloupců Excelu jsou stejné, takže mapování bude provedeno automaticky. Klikněte na Mapování k mapování sloupců. Viz následující obrázek:

Vytvořte úlohu SQL pro odeslání zprávy o databázi e-mailem

Jakmile je balíček vytvořen, vytvořte úlohu SQL pro provádění následujících činností:

  1. Spusťte balíček SSIS k naplnění dat ze všech serverů.
  2. Zašlete e-mailem zprávu o databázi požadovanému týmu.

V SQL Job musíme vytvořit dva kroky. V prvním kroku se spustí balíček SSIS a ve druhém kroku se provede postup odeslání e-mailu.

Chcete-li vytvořit úlohu SQL, otevřete SSMS>> SQL Server Agent>> Klikněte pravým tlačítkem na Nová úloha SQL .

O Nové zaměstnání průvodce, vyberte Krok a klikněte na Ne w V Kroku nové úlohy dialogovém okně Krok jméno do textového pole zadejte požadovaný název a vyberte Balík služeb SQL Server Integration z Typ rozevíracím seznamu. V Textu balíčku zadejte umístění balíčku SSIS krabice. Viz následující obrázek:

Kliknutím na OK zavřete Nový krok úlohy .

Vytvořte další krok úlohy, který provede uloženou proceduru pro odeslání zprávy e-mailem. K odeslání e-mailu používá systémový postup. Balíček SSIS zkopíruje databázové informace do konkrétního umístění, a proto uveďte úplnou cestu k souboru aplikace Excel v parametru @file_attachments v sp_send_dbmail uložená procedura.

Chcete-li vytvořit uloženou proceduru, spusťte následující kód v DBATools databáze centrálního serveru:

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 krok. 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

Viz následující obrázek:

Click OK to close the wizard. Now to configure Job Schedule , select Schedules on the New Job okno. 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. Viz následující obrázek:

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. Viz následující obrázek:

Shrnutí

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. Jak mohu vybrat posledních 5 řádků v tabulce bez řazení?

  2. Připojení se nezdařilo:Přístup odepřen uživateli 'root'@'localhost' (pomocí hesla:YES) z funkce php

  3. Začínáme s aplikací Oracle Application Express-APEX

  4. Jak spustit skript SQL Plus v PowerShell