sql >> データベース >  >> RDS >> Database

データベース要約レポートを送信する自動電子メールシステム

    データベースの監視は、データベース管理者にとって最も重要な仕事です。大規模な組織や企業には、同じデータセンターまたは地理的に異なるデータセンターに配置された複数のデータベースサーバーがあります。データベース監視用の多くの標準ツールがあります。これらのツールは、SQLServerの動的管理ビューとシステムストアドプロシージャを使用してデータを入力します。これらのDMVを使用して、カスタマイズされた自動システムを作成し、データベースのステータスを入力してレポートを電子メールで送信できます。

    この記事では、システムストアドプロシージャとリンクサーバーを使用して、さまざまなサーバーにあるデータベースの情報を入力し、レポートを送信するジョブをスケジュールする方法を示します。

    このデモでは、次のタスクを実行します。

    1. TTI609-VM1で必要なストアドプロシージャを作成します 、 TTI609-VM2、 およびTTI412-VM データベース、データベースオブジェクト、およびSQLジョブの情報を入力するサーバー。
    2. TTI609-VM1 からデータベースの概要、データベースオブジェクトの概要、およびSQLジョブの概要を入力するストアドプロシージャを作成します およびTTI609-VM2 サーバーを作成し、関連するテーブルに保存します。
    3. 次のタスクを実行するSSISパッケージを作成します。
        • SQLスクリプトタスクの実行を使用してストアドプロシージャを実行します 。
        • TTI412-VMで作成されたSQLテーブルからデータをエクスポートします Excelファイルの個々のタブに保存します。
    4. SQL Serverジョブを作成してSSISパッケージを実行し、データベース情報とストアドプロシージャを作成してレポートを電子メールで送信します。

    次の画像は、デモのセットアップを示しています。

    ストアドプロシージャのリストは次のとおりです。

    以下はテーブルのリストです:

    両方のデータベースサーバーでストアドプロシージャを作成する

    前述したように、 TTI609-VM1からデータを入力します およびTTI609-VM2 サーバー。データベースへの入力に使用されるストアドプロシージャは、両方のサーバーで同じままです。
    最初に、 DBAToolsという名前のデータベースを作成しました。 両方のサーバーで。これらのデータベースにストアドプロシージャを作成しました。これを行うには、 TTI609-VM1で次のコードを実行します。 およびTTI609-VM2 サーバー:

    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

    Pull_Database_Informationという名前のストアドプロシージャを作成します DBATools データベース。このストアドプロシージャは、両方のデータベースサーバーに存在するすべてのデータベースの次の情報を入力します。

    1. データベース名。
    2. データベースの互換性レベル。
    3. データベースの状態(ONLINE / OFFLINE / RESTORING / SUSPEND)。
    4. データベースリカバリモデル(SIMPLE / FULL / BULK-LOGGED)。
    5. データベースサイズ(MB)。
    6. 合計データファイルサイズ。
    7. 使用データファイルサイズ。
    8. ログファイルの合計サイズ。
    9. 使用されたログファイルのサイズ。

    DBAToolsで次のコードを実行します ストアドプロシージャを作成するための両方のデータベースサーバーのデータベース:

    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

    次に、 Pull_Database_Objectsという名前のストアドプロシージャを作成します DBATools データベース。このストアドプロシージャは、両方のデータベースサーバー内のすべてのデータベースを反復処理し、すべてのデータベースオブジェクトの数を入力します。次の列に入力されます:

    1. サーバー/ホスト名。
    2. データベース名。
    3. データベースオブジェクトのタイプ(テーブル/ストアドプロシージャ/ SQLスケーラー関数/制約など)
    4. データベースオブジェクトの総数。

    DBAToolsで次のコードを実行します 両方のデータベースサーバー上のデータベースを使用して、ストアドプロシージャを作成します。

    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

    Pull_SQLJob_Informationという名前のストアドプロシージャを作成します DBATools データベース。このストアドプロシージャは、すべてのデータベースサーバーを反復処理し、すべてのSQLジョブとそのステータスの情報を入力します。次の列に入力されます:

    1. サーバー/ホスト名。
    2. SQLジョブ名。
    3. SQLジョブの所有者。
    4. 職種。
    5. 職務内容。
    6. ジョブのステータス(有効/無効)
    7. 雇用創出の日付。
    8. ジョブの変更日。
    9. ジョブのスケジュールステータス。
    10. スケジュール名。
    11. 最終実行日時
    12. 最後の実行ステータス。

    DBAToolsで次のコードを実行します 両方のデータベースサーバー上のデータベースを使用して、ストアドプロシージャを作成します。

    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

    中央サーバー上にストアドプロシージャ、リンクサーバー、およびテーブルを作成する

    TTI609-VM1で手順が作成されたら およびTTI609-VM2 データベースサーバー、中央サーバー( TTI412-VM )で必要なプロシージャとテーブルを作成します 。

    MonitoringDashboardという名前の別のデータベースを作成しました TTI412-VM サーバ。次のコードを実行して、中央サーバーにデータベースを作成します。

    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

    データベースが作成されたら、LINKEDサーバーを使用して TTI609-VM1でプロシージャを実行するストアドプロシージャを作成します。 およびTTI609-VM2 データベースサーバー。 TTI412-VMの「マスター」データベースで次のコードを実行します リンクサーバーを作成するデータベースサーバー:

    スクリプト1:リンクサーバー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

    スクリプト2:リンクサーバー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

    ストアドプロシージャとテーブルを作成する

    リンクサーバーを作成したら、 Database_Object_Summeryという名前の3つのテーブルを作成する必要があります。 、 Database_Summery 、および SQL_Job_List MonitoringDashboard データベース。これらのテーブルには、 Generate_Database_Informationによって入力された情報が格納されます ストアドプロシージャとその後のデータ。Excelでレポートを生成するために使用されるテーブルに格納されます。

    次のコードを実行して、 SQL_Job_Listを作成します。 テーブル:

    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

    次のコードを実行して、 lst_dbserversを作成します。 テーブル:

    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

    次のコードを実行して、 Database_Summeryを作成します テーブル:

    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

    次のコードを実行して、 Database_Object_Summeryを作成します。 テーブル:

    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

    テーブルが作成されたら、 Generate_Database_Informationという名前のストアドプロシージャを作成します MonitoringDashboard データベース。 「RPC」を使用して、 TTI609-VM1で作成されたストアドプロシージャを実行します およびTTI609-VM2 データを入力するデータベースサーバー。

    次のコードを実行して、ストアドプロシージャを作成します。

    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

    プロシージャを作成したら、SSISパッケージを作成してデータをExcelファイルにエクスポートします。

    ExcelファイルにデータをエクスポートするためのSSISパッケージを作成する

    過去の記事では、データフロータスク、OLEDB接続、およびExcel接続を構成する手順について説明したため、この部分はスキップします。

    データをExcelファイルにエクスポートするには、SQL Serverデータツールを開き、Export_Database_Informationという名前の新しいSSISプロジェクトを作成します。

    プロジェクトが作成されたら、SQLタスクの実行をドラッグアンドドロップします 制御フローへ ウィンドウを開き、名前をサーバーからデータを入力に変更します。 。次の画像を参照してください:

    SQLタスクの実行をダブルクリックします (サーバーからデータを入力します)。 SQLタスクエディタの実行 ダイアログボックスが開き、SQL接続を構成します。次の画像を参照してください:

    接続 提出したら、 OLEDBを選択します 接続文字列とSQLステートメント フィールドに、次のクエリを入力します:

    USE monitoringdashboard 
    go 
    EXEC Generate_database_information

    [OK]をクリックしてダイアログボックスを閉じます。

    制御フローについて 画面で、SSISツールボックスからデータフロータスクをドラッグアンドドロップし、名前をレポートの生成に変更します。 次の画像を参照してください:

    ダブルクリックしてデータフローを開きます ウィンドウ。

    前述したように、 Generate_Database_Information プロシージャは、データベースサーバーの出力を次のテーブルに挿入します。

    1. Database_Object_Summery
    2. Database_Summery
    3. SQL_Job_List

    3つのワークシートを持つExcelファイルを作成しました。次の表は、SQLテーブルとExcelワークシートのマッピングを示しています。


    データフロー ウィンドウで、3つのADO.Netソースと3つのExcel宛先をドラッグアンドドロップします。次の画像を参照してください:

    オブジェクトの概要をダブルクリックします y(ADO.NETソース)ADO.NETソース 編集者。

    1. TTI412-VM \ SQL2017MonitoringDashboardを選択します ADO.NET接続マネージャーから ドロップダウンボックス。
    2. テーブルまたはビューを選択します データアクセスモードから ドロップダウンボックス。
    3. Database_Object_Summeryを選択します テーブルまたはビューの名前から ドロップダウンボックス。

    データベース情報をダブルクリックします (ADO.NETソース)ADO.NETソースエディタ

    1. TTI412-VM\ SQL2017MonitoringDashboard」を選択します 」ADO.NET接続マネージャーから ドロップダウンボックス。
    2. テーブルまたはビューを選択します データアクセスモードから ドロップダウンボックス。
    3. Database_Summery」を選択します 」テーブルまたはビューの名前から ドロップダウンボックス。

    SQLジョブをダブルクリックします (ADO.NETソース)ADO.NETソースエディタ

    1. TTI412-VM \ SQL2017MonitoringDashboardを選択します ADO.NET接続マネージャーで。
    2. テーブルまたはビューを選択します データアクセスモードから ドロップダウンボックス。
    3. SQL_Job_Listを選択します テーブルまたはビューの名前 ドロップダウンボックス。

    次に、SSISツールボックスから3つのExcelの宛先をドラッグアンドドロップします。次の画像を参照してください:

    宛先がコピーされたら、青い矢印をADO.Netソースの下にドラッグし、Excelの宛先にドロップします。すべての人に同じことをします。次の画像を参照してください:

    Excelオブジェクトの概要をダブルクリックします (ADO.NETソース) Excel Destination Editor

    1. Excel接続マネージャーを選択します Excel接続マネージャーから ドロップダウンボックス。
    2. [可能]または[表示]を選択 データアクセスモードから ドロップダウンボックス。
    3. Object Summery $を選択します Excelシートの名前から ドロップダウンボックス。

    前述したように、SQLテーブルとExcel列の列名は同じであるため、マッピングは自動的に行われます。 マッピングをクリックします 列をマップします。次の画像を参照してください:

    Excelデータベース情報をダブルクリックします (Excel Destination) Excel Destination Editor

    1. Excel接続マネージャーを選択します Excel接続マネージャーから ドロップダウンボックス。
    2. [可能]または[表示]を選択 データアクセスモードから ドロップダウンボックス。
    3. データベース情報$を選択します Excelシートの名前から ドロップダウンボックス。

    前述したように、SQLテーブルとExcel列の列名は同じであるため、マッピングは自動的に行われます。 マッピングをクリックします 列をマップします。次の画像を参照してください:

    ExcelSQLジョブをダブルクリックします (Excel Destination) Excel Destination Editor

    1. Excel接続マネージャーを選択します Excel接続マネージャーから ドロップダウンボックス。
    2. [可能]または[表示]を選択 データアクセスモードから ドロップダウンボックス。
    3. Excelシートの名前から「SQLJobs$」を選択します ドロップダウンボックス。

    前述したように、SQLテーブルとExcel列の列名は同じであるため、マッピングは自動的に行われます。 マッピングをクリックします 列をマップします。次の画像を参照してください:

    データベースレポートを電子メールで送信するSQLジョブを作成します

    パッケージが作成されたら、次のアクティビティを実行するSQLジョブを作成します。

    1. SSISパッケージを実行して、すべてのサーバーからデータを入力します。
    2. データベースレポートを必要なチームにメールで送信します。

    SQLジョブでは、2つのステップを作成する必要があります。最初のステップはSSISパッケージを実行し、2番目のステップは電子メールを送信する手順を実行します。

    SQLジョブを作成するには、SSMS>> SQLServerエージェントを開きます。>>新しいSQLジョブを右クリックします 。

    新しい仕事 ウィザードで、ステップを選択します オプションを選択し、 Neをクリックします w。 新しいジョブステップ ステップのダイアログボックス 名前 テキストボックスに目的の名前を入力し、SQLServer統合サービスパッケージを選択します タイプから ドロップダウンボックス。 パッケージテキストでSSISパッケージの場所を指定します 箱。次の画像を参照してください:

    [OK]をクリックして、新しいジョブステップを閉じます 。

    レポートを電子メールで送信するためのストアドプロシージャを実行する別のジョブステップを作成します。システム手順を使用して電子メールを送信します。 SSISパッケージは、データベース情報を特定の場所にコピーするため、sp_send_dbmailの@file_attachmentsパラメーターにExcelファイルのフルパスを提供します。 ストアドプロシージャ。

    ストアドプロシージャを作成するには、 DBAToolsで次のコードを実行します 中央サーバーのデータベース:

    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 窓。 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:

    概要

    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. マージ結合連結によるソートの回避

    2. nodejsでmysqlクエリコールバックにパラメータを渡す方法

    3. SQL Server v.Next:STRING_AGG()のパフォーマンス

    4. [ビデオ]AnsibleとPostgreSQL