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 @example@sqldat.com + 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 @example@sqldat.com + 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='example@sqldat.com', 
            @example@sqldat.com, 
            @subject='Database Summery Report', 
            @file_attachments= 
          'C:\Users\Administrator\Desktop\Database_Information.xlsx', 
            @copy_recipients='', 
            @blind_copy_recipients='', 
            @body_format='HTML', 
            @example@sqldat.com 
      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