Databasebewaking is de meest essentiële taak van elke databasebeheerder. Grote organisaties en bedrijven hebben meerdere databaseservers die zich in hetzelfde datacenter of in de geografisch verschillende datacenters bevinden. Er zijn veel standaardtools voor databasemonitoring. Deze hulpprogramma's gebruiken de dynamische beheerweergaven van SQL Server en de door het systeem opgeslagen procedure om de gegevens te vullen. Met behulp van deze DMV's kunnen we ons aangepaste geautomatiseerde systeem maken om de status van de database te vullen en het rapport te e-mailen.
In dit artikel ga ik demonstreren hoe we de door het systeem opgeslagen procedure en de gekoppelde server kunnen gebruiken om de informatie van databases op verschillende servers te vullen en de taak te plannen om het rapport te verzenden.
In deze demo ga ik de volgende taken uitvoeren:
- Maak vereiste opgeslagen procedures op TTI609-VM1 , TTI609-VM2, en TTI412-VM servers om informatie over de database, database-objecten en SQL-taken in te vullen.
- Maak een opgeslagen procedure om de database-samenvatting, database-object-samenvatting en SQL Job-samenvatting in te vullen vanuit de TTI609-VM1 en TTI609-VM2 servers en sla ze op in gerelateerde tabellen.
- Maak een SSIS-pakket dat de volgende taken uitvoert:
- Voert een opgeslagen procedure uit met behulp van SQL-scripttaak uitvoeren .
- Gegevens exporteren uit SQL-tabellen die zijn gemaakt op TTI412-VM en sla het op in het individuele tabblad van een Excel-bestand.
- Maak een SQL Server-taak om het SSIS-pakket uit te voeren om de database-informatie en opgeslagen procedure te vullen om het rapport te e-mailen.
De volgende afbeelding illustreert de demo-opstelling:
Hieronder volgt de lijst met opgeslagen procedures:
Hieronder volgt de lijst met tabellen:
Opgeslagen procedures maken op beide databaseservers
Zoals ik al zei, gaan we gegevens invullen van de TTI609-VM1 en TTI609-VM2 servers. De opgeslagen procedures die worden gebruikt om de database te vullen, blijven op beide servers hetzelfde.
Dus ten eerste heb ik een database gemaakt met de naam DBATools op beide servers. Ik heb een opgeslagen procedure in die databases gemaakt. Voer hiervoor de volgende code uit op de TTI609-VM1 en TTI609-VM2 servers:
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
Maak een opgeslagen procedure met de naam Pull_Database_Information in de DBATools databank. Deze opgeslagen procedure vult de volgende informatie in van alle databases die op beide databaseservers bestaan.
- Databasenaam.
- Databasecompatibiliteitsniveau.
- Status van de database (ONLINE/OFFLINE/RESTORING/SUSPEND).
- Model voor databaseherstel (EENVOUDIG / VOLLEDIG / BULK-LOGGED).
- Databasegrootte in MB.
- Totale grootte van gegevensbestand.
- Gebruikte gegevensbestandsgrootte.
- Totale grootte van logbestand.
- Gebruikte logbestandsgrootte.
Voer de volgende code uit in de DBATools database van beide databaseservers om de opgeslagen procedure te maken:
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
Maak vervolgens opgeslagen procedures met de naam Pull_Database_Objects in de DBATools databank. Deze opgeslagen procedure doorloopt alle databases binnen beide databaseservers en vult de telling van alle databaseobjecten. Het vult de volgende kolommen:
- Server-/hostnaam.
- Databasenaam.
- Type database-object (Tabel / Opgeslagen procedure / SQL Scaler-functies / beperkingen enz...)
- Totaal aantal database-objecten.
Voer de volgende code uit in de DBATools database op beide databaseservers om de opgeslagen procedure te maken:
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
Maak opgeslagen procedures met de naam Pull_SQLJob_Information in de DBATools databank. Deze opgeslagen procedure doorloopt de hele databaseserver en vult de informatie van alle SQL-taken en hun statussen. Het vult de volgende kolommen:
- Server-/hostnaam.
- SQL-taaknaam.
- Eigenaar van SQL Job.
- Functiecategorie.
- Beschrijving van de taak.
- Status van taak (ingeschakeld/uitgeschakeld)
- Een datum waarop banen zijn gecreëerd.
- datum vacature gewijzigd.
- Taak geplande status.
- Naam planning.
- Laatste uitvoeringsdatum en -tijd
- Laatste uitvoeringsstatus.
Voer de volgende code uit in de DBATools database op beide databaseservers om de opgeslagen procedure te maken:
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
Maak opgeslagen procedures, gekoppelde server en tabellen op de centrale server
Nadat de procedures zijn gemaakt op de TTI609-VM1 en TTI609-VM2 databaseservers, maak de vereiste procedures en tabellen aan op de centrale server (TTI412-VM ).
Ik heb een aparte database gemaakt met de naam MonitoringDashboard op de TTI412-VM server. Voer de volgende code uit om een database op de centrale server aan te maken.
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
Nadat de database is gemaakt, maakt u een opgeslagen procedure die LINKED Server gebruikt om een procedure uit te voeren op de TTI609-VM1 en TTI609-VM2 database-servers. Voer de volgende code uit in de “master” database van de TTI412-VM databaseserver om een gekoppelde server te maken:
Script 1:Maak gekoppelde server TTI609-VM1
USE [master] go /****** Object: LinkedServer [TTI609-VM1] Script Date: 10/25/2018 2:49:28 PM ******/ EXEC master.dbo.Sp_addlinkedserver @server = N'TTI609-VM1', @srvproduct=N'SQL Server' /* For security reasons the linked server remote logins password is changed with ######## */ EXEC master.dbo.Sp_addlinkedsrvlogin @rmtsrvname=N'TTI609-VM1', @useself=N'False', @locallogin=NULL, @rmtuser=N'sa', @rmtpassword='########' go EXEC master.dbo.Sp_serveroption @server=N'TTI609-VM1', @optname=N'collation compatible', @optvalue=N'true' go EXEC master.dbo.Sp_serveroption @server=N'TTI609-VM1', @optname=N'data access', @optvalue=N'true' go EXEC master.dbo.Sp_serveroption @server=N'TTI609-VM1', @optname=N'dist', @optvalue=N'false' go EXEC master.dbo.Sp_serveroption @server=N'TTI609-VM1', @optname=N'rpc', @optvalue=N'true' go EXEC master.dbo.Sp_serveroption @server=N'TTI609-VM1', @optname=N'rpc out', @optvalue=N'true' go EXEC master.dbo.Sp_serveroption @server=N'TTI609-VM1', @optname=N'connect timeout', @optvalue=N'0' go EXEC master.dbo.Sp_serveroption @server=N'TTI609-VM1', @optname=N'query timeout', @optvalue=N'0' go EXEC master.dbo.Sp_serveroption @server=N'TTI609-VM1', @optname=N'use remote collation', @optvalue=N'true' go EXEC master.dbo.Sp_serveroption @server=N'TTI609-VM1', @optname=N'remote proc transaction promotion', @optvalue=N'false' go
Script 2:Maak gekoppelde server TTI609-VM2
USE [master] go /****** Object: LinkedServer [TTI609-VM2] Script Date: 10/25/2018 2:55:29 PM ******/ EXEC master.dbo.Sp_addlinkedserver @server = N'TTI609-VM2', @srvproduct=N'SQL Server' /* For security reasons the linked server remote logins password is changed with ######## */ EXEC master.dbo.Sp_addlinkedsrvlogin @rmtsrvname=N'TTI609-VM2', @useself=N'False', @locallogin=NULL, @rmtuser=N'sa', @rmtpassword='########' go EXEC master.dbo.Sp_serveroption @server=N'TTI609-VM2', @optname=N'collation compatible', @optvalue=N'true' go EXEC master.dbo.Sp_serveroption @server=N'TTI609-VM2', @optname=N'data access', @optvalue=N'true' go EXEC master.dbo.Sp_serveroption @server=N'TTI609-VM2', @optname=N'dist', @optvalue=N'false' go EXEC master.dbo.Sp_serveroption @server=N'TTI609-VM2', @optname=N'rpc', @optvalue=N'true' go EXEC master.dbo.Sp_serveroption @server=N'TTI609-VM2', @optname=N'rpc out', @optvalue=N'true' go EXEC master.dbo.Sp_serveroption @server=N'TTI609-VM2', @optname=N'connect timeout', @optvalue=N'0' go EXEC master.dbo.Sp_serveroption @server=N'TTI609-VM2', @optname=N'collation name', @optvalue=NULL go EXEC master.dbo.Sp_serveroption @server=N'TTI609-VM2', @optname=N'query timeout', @optvalue=N'0' go EXEC master.dbo.Sp_serveroption @server=N'TTI609-VM2', @optname=N'use remote collation', @optvalue=N'true' go EXEC master.dbo.Sp_serveroption @server=N'TTI609-VM2', @optname=N'remote proc transaction promotion', @optvalue=N'false' go
Maak een opgeslagen procedure en tabellen
Nadat de gekoppelde server is gemaakt, moeten we drie tabellen maken met de naam Database_Object_Summery , Database_Summery , en SQL_Job_List in het Bewakingsdashboard databank. In deze tabellen wordt informatie opgeslagen die wordt ingevuld door de Generate_Database_Information opgeslagen procedure en later de gegevens, opgeslagen in die tabellen die zullen worden gebruikt om een rapport in Excel te genereren.
Voer de volgende code uit om de SQL_Job_List . te maken tafel:
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
Voer de volgende code uit om de lst_dbservers . te maken tafel:
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
Voer de volgende code uit om de Database_Summery . te maken tafel:
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
Voer de volgende code uit om de Database_Object_Summery . te maken tafel:
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
Nadat de tabellen zijn gemaakt, maakt u een opgeslagen procedure met de naam Generate_Database_Information op het Bewakingsdashboard databank. Met behulp van "RPC" voert het opgeslagen procedures uit, gemaakt op de TTI609-VM1 en TTI609-VM2 databaseservers om de gegevens te vullen.
Voer de volgende code uit om een opgeslagen procedure te maken:
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
Nadat de procedure is gemaakt, maakt u een SSIS-pakket om gegevens naar een Excel-bestand te exporteren.
Maak SSIS-pakket om gegevens in Excel-bestand te exporteren
In mijn eerdere artikelen heb ik de stappen uitgelegd om de gegevensstroomtaken, OLEDB-verbindingen en Excel-verbindingen te configureren, daarom sla ik dit deel over.
Om gegevens naar een Excel-bestand te exporteren, opent u SQL Server Data-tools en maakt u een nieuw SSIS-project met de naam Export_Database_Information.
Zodra het project is gemaakt, slepen en neerzetten SQL-taak uitvoeren naar de Besturingsstroom venster en hernoem het als Gegevens invullen van servers . Zie de volgende afbeelding:
Dubbelklik op SQL-taak uitvoeren (Gegevens invullen vanaf server). De SQL-taakeditor uitvoeren dialoogvenster wordt geopend om de SQL-verbinding te configureren. Zie de volgende afbeelding:
In de Verbinding opgeslagen, selecteert u de OLEDB verbindingsreeks en in de SQL-instructie veld, geef de volgende vraag op:
USE monitoringdashboard go EXEC Generate_database_information
Klik op OK om het dialoogvenster te sluiten.
Op de Besturingsstroom scherm, sleept u Data Flow Task uit SSIS Toolbox en zet u deze neer en hernoemt u deze als Rapport genereren. Zie de volgende afbeelding:
Dubbelklik om deGegevensstroom . te openen venster.
Zoals ik eerder al zei, de Generate_Database_Information procedure voegt de uitvoer van de databaseservers in de volgende tabellen in:
- Database_Object_Summery
- Database_Summery
- SQL_Job_List
Ik heb een Excel-bestand gemaakt met drie werkbladen. De volgende tabellen tonen de toewijzing van de SQL-tabellen en het Excel-werkblad.
In de gegevensstroom venster, sleept u drie ADO.Net-bronnen en drie Excel-bestemmingen. Zie de volgende afbeelding:
Dubbelklik op Objectoverzicht y (ADO.NET Source) in ADO.NET Source Bewerker.
- Selecteer TTI412-VM\SQL2017MonitoringDashboard van de ADO.NET verbindingsbeheerder vervolgkeuzelijst.
- Selecteer Tabel of Weergave vanuit de Gegevenstoegangsmodus vervolgkeuzelijst.
- Selecteer Database_Object_Summery van Naam van de tabel of de weergave vervolgkeuzelijst.
Dubbelklik op Database-informatie (ADO.NET Source) in ADO.NET Source Editor .
- Selecteer "TTI412-VM\SQL2017MonitoringDashboard ” van de ADO.NET-verbindingsbeheerder vervolgkeuzelijst.
- Selecteer Tabel of Weergave vanuit de Gegevenstoegangsmodus vervolgkeuzelijst.
- Selecteer "Database_Summery ” van de Naam van de tabel of de weergave vervolgkeuzelijst.
Dubbelklik op SQL-taken (ADO.NET Source) in ADO.NET Source Editor .
- Selecteer TTI412-VM\SQL2017MonitoringDashboard in de ADO.NET verbindingsmanager.
- Selecteer Tabel of Weergave vanuit deGegevenstoegangsmodus vervolgkeuzelijst.
- Selecteer SQL_Job_List in de Naam van de tabel of de weergave vervolgkeuzelijst.
Sleep nu drie Excel-bestemmingen vanuit SSIS Toolbox. Zie de volgende afbeelding:
Nadat de bestemmingen zijn gekopieerd, sleept u de blauwe pijl onder de ADO.Net-bron en zet u deze neer op de Excel-bestemming. Doe hetzelfde voor iedereen. Zie de volgende afbeelding:
Dubbelklik op Excel-objectoverzicht (ADO.NET-bron) in Excel-bestemmingseditor .
- Selecteer Excel Verbindingsbeheer van de Excel-verbindingsbeheerder vervolgkeuzelijst.
- Selecteer Tin staat of Bekijk vanuit de Gegevenstoegangsmodus vervolgkeuzelijst.
- Selecteer Object Summery$ uit de Naam van het Excel-blad vervolgkeuzelijst.
Zoals ik al zei, zijn de kolomnamen van de SQL-tabel en de Excel-kolommen hetzelfde, dus het in kaart brengen wordt automatisch gedaan. Klik op Kaarten om de kolommen in kaart te brengen. Zie de volgende afbeelding:
Dubbelklik Excel-databasegegevens (Excel-bestemming) in Excel-bestemmingseditor .
- Selecteer Excel Verbindingsbeheer van de Excel-verbindingsbeheerder vervolgkeuzelijst.
- Selecteer Tin staat of Bekijk vanuit de Gegevenstoegangsmodus vervolgkeuzelijst.
- Selecteer Database-informatie$ uit de Naam van het Excel-blad vervolgkeuzelijst.
Zoals ik al zei, zijn de kolomnamen van de SQL-tabel en de Excel-kolommen hetzelfde, dus het in kaart brengen wordt automatisch gedaan. Klik op Kaarten om de kolommen in kaart te brengen. Zie de volgende afbeelding:
Dubbelklik op Excel SQL-taken (Excel-bestemming) in Excel-bestemmingseditor .
- Selecteer Excel Verbindingsbeheer van de Excel-verbindingsbeheerder vervolgkeuzelijst.
- Selecteer Tin staat of Bekijk vanuit de Gegevenstoegangsmodus vervolgkeuzelijst.
- Selecteer "SQL Jobs$ uit de naam van het Excel-blad vervolgkeuzelijst.
Zoals ik al zei, zijn de kolomnamen van de SQL-tabel en de Excel-kolommen hetzelfde, dus het in kaart brengen wordt automatisch gedaan. Klik op Kaarten om de kolommen in kaart te brengen. Zie de volgende afbeelding:
Maak een SQL-taak om het databaserapport te e-mailen
Nadat het pakket is gemaakt, maakt u een SQL-taak om de volgende activiteiten uit te voeren:
- Voer het SSIS-pakket uit om gegevens van alle servers te vullen.
- E-mail het databaserapport naar het vereiste team.
In SQL Job moeten we twee stappen maken. De eerste stap voert het SSIS-pakket uit en de tweede stap voert de procedure uit om een e-mail te verzenden.
Om een SQL-taak aan te maken, opent u SSMS>> SQL Server Agent>> Klik met de rechtermuisknop op Nieuwe SQL-taak .
Om de nieuwe baan wizard, selecteer de Stap optie en klik op Neen w. In de Nieuwe taakstap dialoogvenster, in de Stap naam tekstvak, geef de gewenste naam op, selecteer SQL Server Integration services-pakket van de Type vervolgkeuzelijst. Geef een locatie van het SSIS-pakket op in de Pakkettekst doos. Zie de volgende afbeelding:
Klik op OK om Nieuwe taakstap te sluiten .
Maak een andere taakstap die een opgeslagen procedure uitvoert om het rapport te e-mailen. Het gebruikt een systeemprocedure om een e-mail te verzenden. Het SSIS-pakket kopieert de database-informatie naar een specifieke locatie, dus geef het volledige pad van het Excel-bestand op in de parameter @file_attachments van sp_send_dbmail opgeslagen procedure.
Om de opgeslagen procedure te maken, voert u de volgende code uit in de DBATools database van Central Server:
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 raam. 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:
Samenvatting
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.