データベースの監視は、データベース管理者にとって最も重要な仕事です。大規模な組織や企業には、同じデータセンターまたは地理的に異なるデータセンターに配置された複数のデータベースサーバーがあります。データベース監視用の多くの標準ツールがあります。これらのツールは、SQLServerの動的管理ビューとシステムストアドプロシージャを使用してデータを入力します。これらのDMVを使用して、カスタマイズされた自動システムを作成し、データベースのステータスを入力してレポートを電子メールで送信できます。
この記事では、システムストアドプロシージャとリンクサーバーを使用して、さまざまなサーバーにあるデータベースの情報を入力し、レポートを送信するジョブをスケジュールする方法を示します。
このデモでは、次のタスクを実行します。
- TTI609-VM1で必要なストアドプロシージャを作成します 、 TTI609-VM2、 およびTTI412-VM データベース、データベースオブジェクト、およびSQLジョブの情報を入力するサーバー。
- TTI609-VM1 からデータベースの概要、データベースオブジェクトの概要、およびSQLジョブの概要を入力するストアドプロシージャを作成します およびTTI609-VM2 サーバーを作成し、関連するテーブルに保存します。
- 次のタスクを実行するSSISパッケージを作成します。
-
- SQLスクリプトタスクの実行を使用してストアドプロシージャを実行します 。
- TTI412-VMで作成されたSQLテーブルからデータをエクスポートします Excelファイルの個々のタブに保存します。
-
- 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 データベース。このストアドプロシージャは、両方のデータベースサーバーに存在するすべてのデータベースの次の情報を入力します。
- データベース名。
- データベースの互換性レベル。
- データベースの状態(ONLINE / OFFLINE / RESTORING / SUSPEND)。
- データベースリカバリモデル(SIMPLE / FULL / BULK-LOGGED)。
- データベースサイズ(MB)。
- 合計データファイルサイズ。
- 使用データファイルサイズ。
- ログファイルの合計サイズ。
- 使用されたログファイルのサイズ。
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 データベース。このストアドプロシージャは、両方のデータベースサーバー内のすべてのデータベースを反復処理し、すべてのデータベースオブジェクトの数を入力します。次の列に入力されます:
- サーバー/ホスト名。
- データベース名。
- データベースオブジェクトのタイプ(テーブル/ストアドプロシージャ/ SQLスケーラー関数/制約など)
- データベースオブジェクトの総数。
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ジョブとそのステータスの情報を入力します。次の列に入力されます:
- サーバー/ホスト名。
- SQLジョブ名。
- SQLジョブの所有者。
- 職種。
- 職務内容。
- ジョブのステータス(有効/無効)
- 雇用創出の日付。
- ジョブの変更日。
- ジョブのスケジュールステータス。
- スケジュール名。
- 最終実行日時
- 最後の実行ステータス。
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 プロシージャは、データベースサーバーの出力を次のテーブルに挿入します。
- Database_Object_Summery
- Database_Summery
- SQL_Job_List
3つのワークシートを持つExcelファイルを作成しました。次の表は、SQLテーブルとExcelワークシートのマッピングを示しています。
データフロー ウィンドウで、3つのADO.Netソースと3つのExcel宛先をドラッグアンドドロップします。次の画像を参照してください:
オブジェクトの概要をダブルクリックします y(ADO.NETソース)ADO.NETソース 編集者。
- TTI412-VM \ SQL2017MonitoringDashboardを選択します ADO.NET接続マネージャーから ドロップダウンボックス。
- テーブルまたはビューを選択します データアクセスモードから ドロップダウンボックス。
- Database_Object_Summeryを選択します テーブルまたはビューの名前から ドロップダウンボックス。
データベース情報をダブルクリックします (ADO.NETソース)ADO.NETソースエディタ 。
- 「TTI412-VM\ SQL2017MonitoringDashboard」を選択します 」ADO.NET接続マネージャーから ドロップダウンボックス。
- テーブルまたはビューを選択します データアクセスモードから ドロップダウンボックス。
- 「Database_Summery」を選択します 」テーブルまたはビューの名前から ドロップダウンボックス。
SQLジョブをダブルクリックします (ADO.NETソース)ADO.NETソースエディタ 。
- TTI412-VM \ SQL2017MonitoringDashboardを選択します ADO.NET接続マネージャーで。
- テーブルまたはビューを選択します データアクセスモードから ドロップダウンボックス。
- SQL_Job_Listを選択します テーブルまたはビューの名前 ドロップダウンボックス。
次に、SSISツールボックスから3つのExcelの宛先をドラッグアンドドロップします。次の画像を参照してください:
宛先がコピーされたら、青い矢印をADO.Netソースの下にドラッグし、Excelの宛先にドロップします。すべての人に同じことをします。次の画像を参照してください:
Excelオブジェクトの概要をダブルクリックします (ADO.NETソース) Excel Destination Editor 。
- Excel接続マネージャーを選択します Excel接続マネージャーから ドロップダウンボックス。
- [可能]または[表示]を選択 データアクセスモードから ドロップダウンボックス。
- Object Summery $を選択します Excelシートの名前から ドロップダウンボックス。
前述したように、SQLテーブルとExcel列の列名は同じであるため、マッピングは自動的に行われます。 マッピングをクリックします 列をマップします。次の画像を参照してください:
Excelデータベース情報をダブルクリックします (Excel Destination) Excel Destination Editor 。
- Excel接続マネージャーを選択します Excel接続マネージャーから ドロップダウンボックス。
- [可能]または[表示]を選択 データアクセスモードから ドロップダウンボックス。
- データベース情報$を選択します Excelシートの名前から ドロップダウンボックス。
前述したように、SQLテーブルとExcel列の列名は同じであるため、マッピングは自動的に行われます。 マッピングをクリックします 列をマップします。次の画像を参照してください:
ExcelSQLジョブをダブルクリックします (Excel Destination) Excel Destination Editor 。
- Excel接続マネージャーを選択します Excel接続マネージャーから ドロップダウンボックス。
- [可能]または[表示]を選択 データアクセスモードから ドロップダウンボックス。
- Excelシートの名前から「SQLJobs$」を選択します ドロップダウンボックス。
前述したように、SQLテーブルとExcel列の列名は同じであるため、マッピングは自動的に行われます。 マッピングをクリックします 列をマップします。次の画像を参照してください:
データベースレポートを電子メールで送信するSQLジョブを作成します
パッケージが作成されたら、次のアクティビティを実行するSQLジョブを作成します。
- SSISパッケージを実行して、すべてのサーバーからデータを入力します。
- データベースレポートを必要なチームにメールで送信します。
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:
- How to populate information of the databases located on remote DB server.
- Create an SSIS package to populate database information and export it to excel file
- Create a multi-step SQL job to generate the report by executing an SSIS package and email the report.