Monitorowanie bazy danych to najważniejsza praca każdego administratora bazy danych. Duże organizacje i firmy mają wiele serwerów baz danych, które znajdują się w tym samym centrum danych lub w geograficznie różnych centrach danych. Istnieje wiele standardowych narzędzi do monitorowania baz danych. Narzędzia te wykorzystują widoki zarządzania dynamicznego programu SQL Server i systemową procedurę składowaną do wypełniania danych. Korzystając z tych DMV, możemy stworzyć nasz dostosowany zautomatyzowany system do wypełniania stanu bazy danych i wysyłania raportu pocztą e-mail.
W tym artykule zademonstruję, w jaki sposób możemy użyć systemowej procedury składowanej i połączonego serwera, aby wypełnić informacje o bazach danych znajdujących się na różnych serwerach i zaplanować zadanie wysłania raportu.
W tym demo wykonam następujące zadania:
- Utwórz wymagane procedury składowane na TTI609-VM1 , TTI609-VM2, i TTI412-VM serwery do wypełniania informacji o bazie danych, obiektach bazy danych i zadaniach SQL.
- Utwórz procedurę składowaną, aby wypełnić podsumowanie bazy danych, podsumowanie obiektu bazy danych i podsumowanie zadania SQL z TTI609-VM1 i TTI609-VM2 serwerów i przechowuj je w powiązanych tabelach.
- Utwórz pakiet SSIS, który wykonuje następujące zadania:
- Wykonuje procedurę składowaną za pomocą Wykonaj zadanie skryptu SQL .
- Eksportuj dane z tabel SQL utworzonych na TTI412-VM i przechowuj go w indywidualnej zakładce pliku Excel.
- Utwórz zadanie SQL Server, aby wykonać pakiet SSIS w celu wypełnienia informacji o bazie danych i procedury składowanej w celu wysłania raportu pocztą e-mail.
Poniższy obraz ilustruje konfigurację demonstracyjną:
Poniżej znajduje się lista procedur składowanych:
Poniżej znajduje się lista tabel:
Utwórz procedury składowane na obu serwerach baz danych
Jak wspomniałem, zamierzamy wypełnić dane z TTI609-VM1 i TTI609-VM2 serwery. Procedury składowane używane do wypełniania bazy danych pozostaną takie same na obu serwerach.
Po pierwsze stworzyłem bazę danych o nazwie DBATools na obu serwerach. W tych bazach danych utworzyłem procedurę składowaną. Aby to zrobić, wykonaj następujący kod na TTI609-VM1 i TTI609-VM2 serwery:
USE [master] go /****** Object: Database [DBATools] Script Date: 10/25/2018 11:25:27 AM ******/ CREATE DATABASE [DBATools] containment = none ON PRIMARY ( NAME = N'DBATools', filename = N'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\DBATools.mdf' , size = 3264kb, maxsize = unlimited, filegrowth = 1024kb ) log ON ( NAME = N'DBATools_log', filename = N'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\DBATools_log.ldf' , size = 816kb, maxsize = 2048gb, filegrowth = 10%) go
Utwórz procedurę składowaną o nazwie Pull_Database_Information w Narzędziach DBA Baza danych. Ta procedura składowana wypełnia następujące informacje o wszystkich bazach danych istniejących na obu serwerach baz danych.
- Nazwa bazy danych.
- Poziom zgodności bazy danych.
- Stan bazy danych (ONLINE/OFFLINE/PRZYWRACANIE/ZAWIESZENIE).
- Model odzyskiwania bazy danych (PROSTY / PEŁNY / BULK-LOGGED).
- Rozmiar bazy danych w MB.
- Całkowity rozmiar pliku danych.
- Używany rozmiar pliku danych.
- Całkowity rozmiar pliku dziennika.
- Używany rozmiar pliku dziennika.
Wykonaj następujący kod w DBATools baza danych obu serwerów baz danych do utworzenia procedury składowanej:
USE DBAtools go CREATE PROCEDURE Pull_Database_Information AS BEGIN IF Object_id('tempdb.dbo.#DBSize') IS NOT NULL DROP TABLE #dbsize CREATE TABLE #dbsize ( database_id INT PRIMARY KEY, data_file_used_size DECIMAL(18, 2), log_file_used_size DECIMAL(18, 2) ) DECLARE @SQLCommand NVARCHAR(max) SELECT @SQLCommand = Stuff((SELECT ' USE [' + d.NAME + '] INSERT INTO #DBSize (database_id, data_file_used_size, log_File_used_size) SELECT DB_ID() , SUM(CASE WHEN [type] = 0 THEN space_used END) , SUM(CASE WHEN [type] = 1 THEN space_used END) FROM ( SELECT s.[type], space_used = SUM(FILEPROPERTY(s.name, ''SpaceUsed'') * 8. / 1024) FROM sys.database_files s GROUP BY s.[type] ) t;' FROM sys.databases d WHERE d.[state] = 0 FOR xml path(''), type).value('.', 'NVARCHAR(MAX)'), 1, 2, '') EXEC sys.Sp_executesql @SQLCommand SELECT d.database_id AS 'Database ID', d.NAME AS 'Database Name', d.state_desc AS 'Database State', d.recovery_model_desc AS 'Recovery Model', t.total_db_size AS 'Database Size', t.data_file_size AS 'Data File Size', s.data_file_used_size AS 'Data File Used', t.log_file_size AS 'Log file size', s.log_file_used_size AS 'Log File Used' FROM (SELECT database_id, log_file_size = Cast(Sum(CASE WHEN [type] = 1 THEN size END) * 8. / 1024 AS DECIMAL(18, 2) ), data_file_size = Cast(Sum(CASE WHEN [type] = 0 THEN size END) * 8. / 1024 AS DECIMAL(18, 2)) , total_DB_size = Cast( Sum(size) * 8. / 1024 AS DECIMAL(18, 2)) FROM sys.master_files GROUP BY database_id) t JOIN sys.databases d ON d.database_id = t.database_id LEFT JOIN #dbsize s ON d.database_id = s.database_id ORDER BY t.total_db_size DESC END
Po drugie, utwórz procedury składowane o nazwie Pull_Database_Objects w Narzędziach DBA Baza danych. Ta procedura składowana przechodzi przez wszystkie bazy danych na obu serwerach baz danych i wypełnia liczbę wszystkich obiektów bazy danych. Wypełnia następujące kolumny:
- Nazwa serwera/hosta.
- Nazwa bazy danych.
- Typ obiektu bazy danych (tabela / procedura składowana / funkcje skalowania SQL / ograniczenia itp.)
- Całkowita liczba obiektów bazy danych.
Wykonaj następujący kod w DBATools bazy danych na obu serwerach baz danych, aby utworzyć procedurę składowaną:
USE dbatools go CREATE PROCEDURE [Pull_database_objects] AS BEGIN CREATE TABLE #finalsummery ( id INT IDENTITY (1, 1), databasename VARCHAR(350), objecttype VARCHAR(200), totalobjects INT ) DECLARE @SQLCommand NVARCHAR(max) DECLARE @I INT=0 DECLARE @DBName VARCHAR(350) DECLARE @DBCount INT CREATE TABLE #databases ( NAME VARCHAR(350) ) INSERT INTO #databases (NAME) SELECT NAME FROM sys.databases WHERE database_id > 4 AND NAME NOT IN ( 'ReportServer', 'reportservertempdb' ) SET @DBCount=(SELECT Count(*) FROM #databases) WHILE ( @DBCount > @I ) BEGIN SET @DBName=(SELECT TOP 1 NAME FROM #databases) SET @SQLCommand=' Insert Into #FinalSummery (DatabaseName,ObjectType,TotalObjects) Select ''' + @DBName + ''', Case when Type=''TR'' then ''SQL DML trigger'' when Type=''FN'' then ''SQL scalar function'' when Type=''D'' then ''DEFAULT (constraint or stand-alone)'' when Type=''PK'' then ''PRIMARY KEY constraint'' when Type=''P'' then ''SQL Stored Procedure'' when Type=''U'' then ''Table (user-defined)'' when Type=''V'' then ''View'' when Type=''X'' then ''Extended stored procedure'' End As ObjectType, Count(Name)TotalObjects from ' + @DBName + '.sys.all_objects group by type' EXEC Sp_executesql @SQLCommand DELETE FROM #databases WHERE NAME = @DBName SET @[email protected] + 1 END SELECT Host_name() AS 'Server Name', databasename, objecttype, totalobjects, Getdate() AS 'ReportDate' FROM #finalsummery WHERE objecttype IS NOT NULL DROP TABLE #finalsummery END
Utwórz procedury składowane o nazwie Pull_SQLJob_Information w Narzędziach DBA Baza danych. Ta procedura składowana przechodzi przez cały serwer bazy danych i wypełnia informacje o wszystkich zadaniach SQL i ich statusach. Wypełnia następujące kolumny:
- Nazwa serwera/hosta.
- Nazwa zadania SQL.
- Właściciel zadania SQL.
- Kategoria pracy.
- Opis pracy.
- Stan zadania (włączony / wyłączony)
- Data utworzenia pracy.
- Data modyfikacji zadania.
- Stan zaplanowanego zadania.
- Nazwa harmonogramu.
- Data i godzina ostatniego wykonania
- Status ostatniego wykonania.
Wykonaj następujący kod w DBATools bazy danych na obu serwerach baz danych, aby utworzyć procedurę składowaną:
CREATE PROCEDURE Pull_sqljob_information AS BEGIN SELECT Host_name() AS 'Server Name', a.NAME AS 'Job Name', d.NAME AS Owner, b.NAME AS Category, a.description AS Description, CASE a.enabled WHEN 1 THEN 'Yes' WHEN 0 THEN 'No' END AS 'IsEnabled', a.date_created AS CreatedDate, a.date_modified AS ModifiedDate, CASE WHEN f.schedule_uid IS NULL THEN 'No' ELSE 'Yes' END AS 'Scheduled?', f.NAME AS JobScheduleName, Max(Cast( Stuff(Stuff(Cast(g.run_date AS VARCHAR), 7, 0, '-'), 5, 0, '-') + ' ' + Stuff(Stuff(Replace(Str(g.run_time, 6, 0), ' ', '0'), 5, 0, ':'), 3, 0, ':') AS DATETIME)) AS [LastRun], CASE g.run_status WHEN 0 THEN 'Failed' WHEN 1 THEN 'Success' WHEN 2 THEN 'Retry' WHEN 3 THEN 'Canceled' WHEN 4 THEN 'In progress' END AS Status FROM msdb.dbo.sysjobs AS a INNER JOIN msdb.dbo.sysjobhistory g ON a.job_id = g.job_id LEFT JOIN msdb.dbo.syscategories AS b ON a.category_id = b.category_id LEFT JOIN msdb.dbo.sysjobsteps AS c ON a.job_id = c.job_id AND a.start_step_id = c.step_id LEFT JOIN msdb.sys.database_principals AS d ON a.owner_sid = d.sid LEFT JOIN msdb.dbo.sysjobschedules AS e ON a.job_id = e.job_id LEFT JOIN msdb.dbo.sysschedules AS f ON e.schedule_id = f.schedule_id GROUP BY a.NAME, d.NAME, b.NAME, a.description, a.enabled, f.schedule_uid, f.NAME, a.date_created, a.date_modified, g.run_status ORDER BY a.NAME END
Utwórz procedury składowane, serwer połączony i tabele na serwerze centralnym
Po utworzeniu procedur na TTI609-VM1 i TTI609-VM2 serwery baz danych, utwórz wymagane procedury i tabele na serwerze centralnym (TTI412-VM ).
Utworzyłem osobną bazę danych o nazwie Panel monitorowania na TTI412-VM serwer. Wykonaj następujący kod, aby utworzyć bazę danych na centralnym serwerze.
USE [master] go /****** Object: Database [MonitoringDashboard] Script Date: 10/25/2018 2:44:09 PM ******/ CREATE DATABASE [MonitoringDashboard] containment = none ON PRIMARY ( NAME = N'MonitoringDashboard', filename = N'E:\MS_SQL\SQL2017_Data\MonitoringDashboard.mdf', size = 8192kb, maxsize = unlimited, filegrowth = 65536kb ) log ON ( NAME = N'MonitoringDashboard_log', filename = N'E:\MS_SQL\SQL2017_Log\MonitoringDashboard_log.ldf', size = 8192kb, maxsize = 2048gb, filegrowth = 65536kb ) go
Po utworzeniu bazy danych utwórz procedurę składowaną, która używa serwera LINKED do wykonania procedury na TTI609-VM1 i TTI609-VM2 serwery baz danych. Wykonaj następujący kod w „głównej” bazie danych TTI412-VM serwer bazy danych do utworzenia serwera połączonego:
Skrypt 1:Utwórz połączony serwer TTI609-VM1
USE [master] go /****** Object: LinkedServer [TTI609-VM1] Script Date: 10/25/2018 2:49:28 PM ******/ EXEC master.dbo.Sp_addlinkedserver @server = N'TTI609-VM1', @srvproduct=N'SQL Server' /* For security reasons the linked server remote logins password is changed with ######## */ EXEC master.dbo.Sp_addlinkedsrvlogin @rmtsrvname=N'TTI609-VM1', @useself=N'False', @locallogin=NULL, @rmtuser=N'sa', @rmtpassword='########' go EXEC master.dbo.Sp_serveroption @server=N'TTI609-VM1', @optname=N'collation compatible', @optvalue=N'true' go EXEC master.dbo.Sp_serveroption @server=N'TTI609-VM1', @optname=N'data access', @optvalue=N'true' go EXEC master.dbo.Sp_serveroption @server=N'TTI609-VM1', @optname=N'dist', @optvalue=N'false' go EXEC master.dbo.Sp_serveroption @server=N'TTI609-VM1', @optname=N'rpc', @optvalue=N'true' go EXEC master.dbo.Sp_serveroption @server=N'TTI609-VM1', @optname=N'rpc out', @optvalue=N'true' go EXEC master.dbo.Sp_serveroption @server=N'TTI609-VM1', @optname=N'connect timeout', @optvalue=N'0' go EXEC master.dbo.Sp_serveroption @server=N'TTI609-VM1', @optname=N'query timeout', @optvalue=N'0' go EXEC master.dbo.Sp_serveroption @server=N'TTI609-VM1', @optname=N'use remote collation', @optvalue=N'true' go EXEC master.dbo.Sp_serveroption @server=N'TTI609-VM1', @optname=N'remote proc transaction promotion', @optvalue=N'false' go
Skrypt 2:Utwórz połączony serwer TTI609-VM2
USE [master] go /****** Object: LinkedServer [TTI609-VM2] Script Date: 10/25/2018 2:55:29 PM ******/ EXEC master.dbo.Sp_addlinkedserver @server = N'TTI609-VM2', @srvproduct=N'SQL Server' /* For security reasons the linked server remote logins password is changed with ######## */ EXEC master.dbo.Sp_addlinkedsrvlogin @rmtsrvname=N'TTI609-VM2', @useself=N'False', @locallogin=NULL, @rmtuser=N'sa', @rmtpassword='########' go EXEC master.dbo.Sp_serveroption @server=N'TTI609-VM2', @optname=N'collation compatible', @optvalue=N'true' go EXEC master.dbo.Sp_serveroption @server=N'TTI609-VM2', @optname=N'data access', @optvalue=N'true' go EXEC master.dbo.Sp_serveroption @server=N'TTI609-VM2', @optname=N'dist', @optvalue=N'false' go EXEC master.dbo.Sp_serveroption @server=N'TTI609-VM2', @optname=N'rpc', @optvalue=N'true' go EXEC master.dbo.Sp_serveroption @server=N'TTI609-VM2', @optname=N'rpc out', @optvalue=N'true' go EXEC master.dbo.Sp_serveroption @server=N'TTI609-VM2', @optname=N'connect timeout', @optvalue=N'0' go EXEC master.dbo.Sp_serveroption @server=N'TTI609-VM2', @optname=N'collation name', @optvalue=NULL go EXEC master.dbo.Sp_serveroption @server=N'TTI609-VM2', @optname=N'query timeout', @optvalue=N'0' go EXEC master.dbo.Sp_serveroption @server=N'TTI609-VM2', @optname=N'use remote collation', @optvalue=N'true' go EXEC master.dbo.Sp_serveroption @server=N'TTI609-VM2', @optname=N'remote proc transaction promotion', @optvalue=N'false' go
Utwórz procedurę składowaną i tabele
Po utworzeniu połączonego serwera musimy utworzyć trzy tabele o nazwie Database_Object_Sumery , Baza danych_summer i SQL_Job_List w Panelu monitorowania Baza danych. Te tabele przechowują informacje wypełniane przez Generate_Database_Information procedura składowana, a później dane przechowywane w tych tabelach, które zostaną użyte do wygenerowania raportu w programie Excel.
Wykonaj następujący kod, aby utworzyć SQL_Job_List tabela:
USE [MonitoringDashboard] go CREATE TABLE [dbo].[sql_job_list] ( [id] [INT] IDENTITY(1, 1) NOT NULL, [servername] [VARCHAR](250) NULL, [jobname] [VARCHAR](250) NULL, [jobowner] [VARCHAR](250) NULL, [jobcategory] [VARCHAR](250) NULL, [jobdescription] [VARCHAR](250) NULL, [jobstatus] [VARCHAR](50) NULL, [createdate] [DATETIME] NULL, [modifieddate] [DATETIME] NULL, [isscheduled] [VARCHAR](5) NULL, [schedulename] [VARCHAR](250) NULL, [reportdate] [DATETIME] NULL ) ON [PRIMARY] go ALTER TABLE [dbo].[sql_job_list] ADD DEFAULT (Getdate()) FOR [ReportDate] go
Wykonaj następujący kod, aby utworzyć lst_dbservers tabela:
USE [MonitoringDashboard] go CREATE TABLE [dbo].[lst_dbservers] ( [id] [INT] IDENTITY(1, 1) NOT NULL, [servername] [VARCHAR](50) NOT NULL, [addeddate] [DATETIME] NOT NULL, PRIMARY KEY CLUSTERED ( [id] ASC )WITH (pad_index = OFF, statistics_norecompute = OFF, ignore_dup_key = OFF, allow_row_locks = on, allow_page_locks = on) ON [PRIMARY], UNIQUE NONCLUSTERED ( [servername] ASC )WITH (pad_index = OFF, statistics_norecompute = OFF, ignore_dup_key = OFF, allow_row_locks = on, allow_page_locks = on) ON [PRIMARY] ) ON [PRIMARY] go ALTER TABLE [dbo].[lst_dbservers] ADD DEFAULT (Getdate()) FOR [AddedDate] go
Wykonaj następujący kod, aby utworzyć Database_Sumery tabela:
USE [MonitoringDashboard] go CREATE TABLE [dbo].[database_summery] ( [id] [INT] IDENTITY(1, 1) NOT NULL, [servername] [VARCHAR](150) NULL, [databaseid] [INT] NULL, [databasename] [VARCHAR](250) NULL, [databasestatus] [VARCHAR](50) NULL, [recoverymodel] [VARCHAR](50) NULL, [compatibilitylevel] [INT] NULL, [databasecreatedate] [DATE] NULL, [databasecreatedby] [VARCHAR](150) NULL, [dbsize] [NUMERIC](10, 2) NULL, [datafilesize] [NUMERIC](10, 2) NULL, [datafileused] [NUMERIC](10, 2) NULL, [logfilesize] [NUMERIC](10, 2) NULL, [logfileused] [NUMERIC](10, 2) NULL, [reportdate] [DATETIME] NULL ) ON [PRIMARY] go ALTER TABLE [dbo].[database_summery] ADD DEFAULT (Getdate()) FOR [ReportDate] go
Wykonaj następujący kod, aby utworzyć Database_Object_Sumery tabela:
USE [MonitoringDashboard] go CREATE TABLE [dbo].[database_object_summery] ( [id] [INT] IDENTITY(1, 1) NOT NULL, [servername] [VARCHAR](250) NULL, [databasename] [VARCHAR](250) NULL, [objecttype] [VARCHAR](50) NULL, [objectcount] [INT] NULL, [reportdate] [DATETIME] NULL ) ON [PRIMARY] go ALTER TABLE [dbo].[database_object_summery] ADD DEFAULT (Getdate()) FOR [ReportDate] go
Po utworzeniu tabel utwórz procedurę składowaną o nazwie Generate_Database_Information na Panelu monitorowania Baza danych. Za pomocą „RPC” wykonuje procedury składowane utworzone na TTI609-VM1 i TTI609-VM2 serwery baz danych do wypełnienia danych.
Wykonaj następujący kod, aby utworzyć procedurę składowaną:
Create PROCEDURE Generate_database_information AS BEGIN /*Cleanup*/ TRUNCATE TABLE database_object_summery TRUNCATE TABLE database_summery TRUNCATE TABLE sql_job_list DECLARE @ServerCount INT DECLARE @i INT =0 DECLARE @SQLCommand_Object_Summery NVARCHAR(max) DECLARE @SQLCommand_Database_Information NVARCHAR(max) DECLARE @SQLCommand_SQL_Job_Information NVARCHAR(max) DECLARE @servername VARCHAR(100) CREATE TABLE #db_server_list ( servername VARCHAR(100) ) INSERT INTO #db_server_list (servername) SELECT servername FROM lst_dbservers SET @ServerCount= (SELECT Count(servername) FROM #db_server_list) WHILE ( @ServerCount > @i ) BEGIN SET @servername=(SELECT TOP 1 servername FROM #db_server_list) SET @SQLCommand_Object_Summery = 'insert into Database_Object_Summery (ServerName,DatabaseName,ObjectType,ObjectCount,ReportDate) exec [' + @servername + '].DBATools.dbo.[Pull_Database_Objects]' SET @SQLCommand_Database_Information = 'insert into Database_Summery (ServerName,DatabaseID,DatabaseName,DatabaseStatus,Recoverymodel,CompatibilityLevel,DatabaseCreateDate,DatabaseCreatedBy,DBSize,DataFileSize,DataFileUsed,LogFileSize,LogFileUsed) exec [' + @servername + '].DBATools.dbo.[Pull_Database_Information]' SET @SQLCommand_SQL_Job_Information = 'insert into SQL_Job_List (ServerName,JobName,JobOwner,Jobcategory,JobDescription,JobStatus,CreateDate,ModifiedDate,IsScheduled,ScheduleName) exec [' + @servername + '].DBATools.dbo.[Pull_SQLJob_Information]' EXEC Sp_executesql @SQLCommand_Object_Summery EXEC Sp_executesql @SQLCommand_Database_Information EXEC Sp_executesql @SQLCommand_SQL_Job_Information DELETE FROM #db_server_list WHERE servername = @servername SET @[email protected] + 1 END END
Po utworzeniu procedury utwórz pakiet SSIS, aby wyeksportować dane do pliku Excel.
Utwórz pakiet SSIS, aby wyeksportować dane w pliku Excel
W moich poprzednich artykułach wyjaśniłem kroki konfiguracji zadań przepływu danych, połączeń OLEDB i połączeń Excela, dlatego pominąłem tę część.
Aby wyeksportować dane do pliku Excel, otwórz narzędzia SQL Server Data i utwórz nowy projekt SSIS o nazwie Export_Database_Information.
Po utworzeniu projektu przeciągnij i upuść Wykonaj zadanie SQL do Przepływu sterowania i zmień jego nazwę na Wypełnij dane z serwerów . Zobacz następujący obraz:
Kliknij dwukrotnie Wykonaj zadanie SQL (Wypełnij dane z serwera). Wykonaj edytor zadań SQL otworzy się okno dialogowe konfiguracji połączenia SQL. Zobacz następujący obraz:
W Połączeniu złożony, wybierz OLEDB parametry połączenia oraz w instrukcji SQL wpisz następujące zapytanie:
USE monitoringdashboard go EXEC Generate_database_information
Kliknij OK, aby zamknąć okno dialogowe.
W przepływie kontroli przeciągnij i upuść zadanie przepływu danych z programu SSIS Toolbox i zmień jego nazwę na Generuj raport. Zobacz następujący obraz:
Kliknij dwukrotnie, aby otworzyćprzepływ danych okno.
Jak wspomniałem wcześniej, Generate_Database_Information procedura wstawia dane wyjściowe serwerów bazy danych do następujących tabel:
- Database_Object_Summer
- Baza danych_lato
- SQL_Job_List
Stworzyłem plik Excela, który zawiera trzy arkusze. Poniższe tabele pokazują mapowanie tabel SQL i arkusza Excel.
W przepływie danych przeciągnij i upuść trzy źródła ADO.Net i trzy miejsca docelowe Excela. Zobacz następujący obraz:
Kliknij dwukrotnie Podsumowanie obiektu y (źródło ADO.NET) w Źródle ADO.NET Redaktor.
- Wybierz TTI412-VM\SQL2017MonitoringDashboard z menedżera połączeń ADO.NET rozwijane pole.
- Wybierz Tabela lub Widok z trybu dostępu do danych rozwijane pole.
- Wybierz Database_Object_Summer z Nazwa tabeli lub widoku rozwijane pole.
Kliknij dwukrotnie Informacje o bazie danych (Źródło ADO.NET) w Edytorze źródeł ADO.NET .
- Wybierz „TTI412-VM\SQL2017MonitoringDashboard ” z menedżera połączeń ADO.NET rozwijane pole.
- Wybierz Tabela lub Widok z trybu dostępu do danych rozwijane pole.
- Wybierz „Baza_danych ” z Nazwy tabeli lub widoku rozwijane pole.
Kliknij dwukrotnie Zadania SQL (Źródło ADO.NET) w Edytorze źródeł ADO.NET .
- Wybierz TTI412-VM\SQL2017MonitoringDashboard w menedżerze połączeń ADO.NET.
- Wybierz Tabela lub Widok z trybu dostępu do danych rozwijane pole.
- Wybierz SQL_Job_List w Nazwie tabeli lub widoku rozwijane pole.
Teraz przeciągnij i upuść trzy miejsca docelowe programu Excel z zestawu narzędzi SSIS. Zobacz następujący obraz:
Po skopiowaniu miejsc docelowych przeciągnij niebieską strzałkę pod źródło ADO.Net i upuść ją w miejscu docelowym programu Excel. Zrób to samo dla wszystkich. Zobacz następujący obraz:
Kliknij dwukrotnie Podsumowanie obiektu Excela (Źródło ADO.NET) w Edytorze docelowym programu Excel .
- Wybierz Menedżera połączeń Excel z menedżera połączeń programu Excel rozwijane pole.
- Wybierz Tmożliwe lub Widok z trybu dostępu do danych rozwijane pole.
- Wybierz Obiekt Summery$ zNazwa arkusza programu Excel rozwijane pole.
Jak wspomniałem, nazwy kolumn tabeli SQL i kolumn Excela są takie same, dlatego mapowanie zostanie wykonane automatycznie. Kliknij Mapowanie aby zmapować kolumny. Zobacz następujący obraz:
Kliknij dwukrotnie Informacje o bazie danych programu Excel (Miejsce docelowe programu Excel) w Edytorze miejsca docelowego programu Excel .
- Wybierz Menedżera połączeń Excel z menedżera połączeń programu Excel rozwijane pole.
- Wybierz Tmożliwe lub Widok z trybu dostępu do danych rozwijane pole.
- Wybierz Informacje o bazie danych$ zNazwa arkusza programu Excel rozwijane pole.
Jak wspomniałem, nazwy kolumn tabeli SQL i kolumn Excela są takie same, dlatego mapowanie zostanie wykonane automatycznie. Kliknij Mapowanie aby zmapować kolumny. Zobacz następujący obraz:
Kliknij dwukrotnie Zadania Excel SQL (Miejsce docelowe programu Excel) w Edytorze miejsca docelowego programu Excel .
- Wybierz Menedżera połączeń Excel z menedżera połączeń programu Excel rozwijane pole.
- Wybierz Tmożliwe lub Widok z trybu dostępu do danych rozwijane pole.
- Wybierz „Zadania SQL$ zNazwa arkusza Excel rozwijane pole.
Jak wspomniałem, nazwy kolumn tabeli SQL i kolumn Excela są takie same, dlatego mapowanie zostanie wykonane automatycznie. Kliknij Mapowanie aby zmapować kolumny. Zobacz następujący obraz:
Utwórz zadanie SQL, aby wysłać raport bazy danych pocztą elektroniczną
Po utworzeniu pakietu utwórz zadanie SQL, aby wykonać następujące czynności:
- Wykonaj pakiet SSIS, aby wypełnić dane ze wszystkich serwerów.
- Wyślij e-mailem raport bazy danych do wymaganego zespołu.
W SQL Job musimy stworzyć dwa kroki. Pierwszy krok uruchomi pakiet SSIS, a drugi krok wykona procedurę wysłania wiadomości e-mail.
Aby utworzyć zadanie SQL, otwórz SSMS>> SQL Server Agent>> Kliknij prawym przyciskiem myszy Nowe zadanie SQL .
O nowej pracy kreatora, wybierz Krok opcję i kliknij Ne w. W kroku Nowa praca okno dialogowe, w kroku nazwa pole tekstowe, podaj żądaną nazwę, wybierz Pakiet usług integracji SQL Server z Typu upuścić pudło. Podaj lokalizację pakietu SSIS w Tekście pakietu skrzynka. Zobacz następujący obraz:
Kliknij OK, aby zamknąć Krok nowej oferty .
Utwórz kolejny krok zadania, który wykona procedurę składowaną w celu wysłania raportu pocztą e-mail. Wykorzystuje procedurę systemową do wysyłania wiadomości e-mail. Pakiet SSIS kopiuje informacje z bazy danych w określonej lokalizacji, dlatego należy podać pełną ścieżkę do pliku programu Excel w parametrze @file_attachments sp_send_dbmail procedura składowana.
Aby utworzyć procedurę składowaną, wykonaj następujący kod w DBATools baza danych Serwera Centralnego:
CREATE PROCEDURE Send_database_report AS BEGIN DECLARE @ProfileName VARCHAR(150) SET @ProfileName = (SELECT NAME FROM msdb..sysmail_profile WHERE profile_id = 7) DECLARE @lsMessage NVARCHAR(max) SET @lsMessage = '<p style="font-family:Arial; font-size:10pt"> Hello Support, Please find attached database summery report. ' + '</p>' EXEC msdb.dbo.Sp_send_dbmail @recipients='[email protected]', @[email protected], @subject='Database Summery Report', @file_attachments= 'C:\Users\Administrator\Desktop\Database_Information.xlsx', @copy_recipients='', @blind_copy_recipients='', @body_format='HTML', @[email protected] END
Once the procedure is created, add a new SQL Job step. Click New . In the New Job Step dialog box, provide a Job Step name, and select Transact-SQL script (T-SQL) from the Type upuścić pudło. In the Command Text box, write the following code:
USE DBAtools Go EXEC Send_database_report
Zobacz następujący obraz:
Click OK to close the wizard. Now to configure Job Schedule , select Schedules on the New Job window. Click New to add a schedule.
In the New Job Schedule dialog box, provide the desired name in the Name text box, choose frequency and time. Zobacz następujący obraz:
Close OK to close the New Job Schedule and in the New Job window, click on OK to close the dialog box.
Now, to test the SQL Job, right-click the Email Database Report SQL job and click Start Job at Step .
In the result of successful completion of the SQL Job, you will receive an email with the database report. Zobacz następujący obraz:
Podsumowanie
In this article I have covered as follows:
- 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.