Il monitoraggio del database è il lavoro più essenziale di qualsiasi amministratore di database. Le grandi organizzazioni e aziende dispongono di più server di database che si trovano nello stesso data center o in data center geograficamente diversi. Esistono molti strumenti standard per il monitoraggio del database. Tali strumenti utilizzano le viste a gestione dinamica di SQL Server e la stored procedure di sistema per popolare i dati. Utilizzando questi DMV, possiamo creare il nostro sistema automatizzato personalizzato per popolare lo stato del database e inviare il rapporto tramite e-mail.
In questo articolo, dimostrerò come possiamo utilizzare la procedura memorizzata di sistema e il server collegato per popolare le informazioni dei database situati su server diversi e pianificare il lavoro per inviare il rapporto.
In questa demo, eseguirò le seguenti attività:
- Crea le stored procedure richieste su TTI609-VM1 , TTI609-VM2, e TTI412-VM server per popolare le informazioni del database, degli oggetti del database e dei lavori SQL.
- Crea una procedura memorizzata per popolare il riepilogo del database, il riepilogo dell'oggetto del database e il riepilogo del processo SQL da TTI609-VM1 e TTI609-VM2 server e archiviarli in tabelle correlate.
- Crea un pacchetto SSIS che esegua le seguenti attività:
- Esegue una procedura memorizzata utilizzando Esegui attività script SQL .
- Esportare i dati dalle tabelle SQL create su TTI412-VM e salvalo nella scheda individuale di un file excel.
- Crea un processo SQL Server per eseguire il pacchetto SSIS per popolare le informazioni sul database e una procedura archiviata per inviare il report tramite posta elettronica.
L'immagine seguente illustra la configurazione demo:
Di seguito è riportato l'elenco delle stored procedure:
Di seguito è riportato l'elenco delle tabelle:
Crea stored procedure su entrambi i server di database
Come accennato, popoleremo i dati dal TTI609-VM1 e TTI609-VM2 server. Le stored procedure utilizzate per popolare il database rimarranno le stesse in entrambi i server.
Per prima cosa, ho creato un database chiamato DBATools su entrambi i server. Ho creato una procedura memorizzata in quei database. Per farlo, esegui il codice seguente su TTI609-VM1 e TTI609-VM2 server:
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
Crea una procedura memorizzata denominata Pull_Database_Information in DBATools Banca dati. Questa procedura memorizzata popola le seguenti informazioni di tutti i database esistenti su entrambi i server di database.
- Nome database.
- Livello di compatibilità del database.
- Stato del database (ONLINE/OFFLINE/RIPRISTINO/SOSPENSIONE).
- Modello di ripristino del database (SEMPLICE / COMPLETO / BULK-LOGGED).
- Dimensioni database in MB.
- Dimensione totale del file di dati.
- Dimensione del file di dati utilizzata.
- Dimensione totale del file di registro.
- Dimensione del file di registro utilizzata.
Esegui il codice seguente in DBATools database di entrambi i server di database per creare la procedura memorizzata:
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
In secondo luogo, crea stored procedure denominate Pull_Database_Objects in DBATools Banca dati. Questa procedura memorizzata scorre tutti i database all'interno di entrambi i server di database e popola il conteggio di tutti gli oggetti di database. Popola le seguenti colonne:
- Nome server/host.
- Nome database.
- Tipo di oggetto database (Tabella / Stored procedure / Funzioni SQL Scaler / Vincoli ecc…)
- Numero totale di oggetti di database.
Esegui il codice seguente in DBATools database su entrambi i server di database per creare la procedura memorizzata:
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
Crea stored procedure denominate Pull_SQLJob_Information in DBATools Banca dati. Questa procedura memorizzata esegue un'iterazione in tutto il server di database e popola le informazioni di tutti i lavori SQL e dei relativi stati. Popola le seguenti colonne:
- Nome server/host.
- Nome processo SQL.
- Proprietario del lavoro SQL.
- Categoria di lavoro.
- Descrizione del lavoro.
- Stato del lavoro (Abilitato/disabilitato)
- Una data di creazione del lavoro.
- Data di modifica del lavoro.
- Stato del lavoro pianificato.
- Nome programma.
- Data e ora dell'ultima esecuzione
- Stato dell'ultima esecuzione.
Esegui il codice seguente in DBATools database su entrambi i server di database per creare la procedura memorizzata:
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
Crea Stored procedure, Linked Server e tabelle sul server centrale
Una volta create le procedure su TTI609-VM1 e TTI609-VM2 server di database, creare le procedure e le tabelle richieste sul server centrale (TTI412-VM ).
Ho creato un database separato denominato MonitoringDashboard su TTI412-VM server. Eseguire il codice seguente per creare un database sul server centrale.
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
Una volta creato il database, creare una stored procedure che utilizzi LINKED Server per eseguire una procedura sul TTI609-VM1 e TTI609-VM2 server di database. Eseguire il codice seguente nel database "master" del TTI412-VM server di database per creare un server collegato:
Script 1:crea server collegato 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:crea server collegato 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
Crea una stored procedure e tabelle
Una volta creato il server collegato, dobbiamo creare tre tabelle denominate Database_Object_Summery , Database_Estate e SQL_Job_List nel MonitoringDashboard Banca dati. Queste tabelle memorizzano le informazioni popolate da Generate_Database_Information stored procedure e successivamente i dati, archiviati in quelle tabelle che verranno utilizzate per generare un report in excel.
Esegui il codice seguente per creare SQL_Job_List tabella:
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
Esegui il codice seguente per creare gli lst_dbservers tabella:
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
Esegui il codice seguente per creare il Database_Summery tabella:
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
Esegui il codice seguente per creare il Database_Object_Summery tabella:
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
Una volta create le tabelle, creare una stored procedure denominata Generate_Database_Information nella Dashboard di monitoraggio Banca dati. Utilizzando “RPC”, esegue le stored procedure, create sul TTI609-VM1 e TTI609-VM2 server di database per popolare i dati.
Eseguire il codice seguente per creare una stored procedure:
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
Una volta creata la procedura, crea un pacchetto SSIS per esportare i dati in un file Excel.
Crea pacchetto SSIS per esportare dati in file excel
Nei miei articoli precedenti, ho spiegato i passaggi per configurare le attività del flusso di dati, le connessioni OLEDB e le connessioni Excel, quindi ho saltato questa parte.
Per esportare i dati in un file Excel, apri gli strumenti dati di SQL Server e crea un nuovo progetto SSIS denominato Export_Database_Information.
Una volta creato il progetto, trascina e rilascia Esegui attività SQL al Flusso di controllo finestra e rinominala come Popola dati dai server . Vedi l'immagine seguente:
Fare doppio clic su Esegui attività SQL (Popolare i dati dal server). L'Esegui Editor attività SQL si apre la finestra di dialogo per configurare la connessione SQL. Vedi l'immagine seguente:
Nella Connessione archiviato, seleziona OLEDB stringa di connessione e nell'istruzione SQL campo, fornire la seguente query:
USE monitoringdashboard go EXEC Generate_database_information
Fare clic su OK per chiudere la finestra di dialogo.
Sul flusso di controllo schermo, trascina e rilascia Attività flusso di dati da SSIS Toolbox e rinominala come Genera rapporto. Vedi l'immagine seguente:
Fare doppio clic per aprire il Flusso di dati finestra.
Come accennato in precedenza, Generate_Database_Information La procedura inserisce l'output dei database server nelle seguenti tabelle:
- Database_Object_Estate
- Database_Estate
- Lista_Lavori_SQL
Ho creato un file Excel con tre fogli di lavoro. Le tabelle seguenti mostrano la mappatura delle tabelle SQL e del foglio di lavoro di Excel.
Nel flusso di dati finestra, trascina e rilascia tre sorgenti ADO.Net e tre destinazioni Excel. Vedi l'immagine seguente:
Fare doppio clic su Riepilogo oggetto y (Sorgente ADO.NET) in Sorgente ADO.NET Editor.
- Seleziona TTI412-VM\SQL2017MonitoringDashboard dal Gestione connessioni ADO.NET casella a discesa.
- Seleziona Tabella o Visualizza dalla Modalità di accesso ai dati casella a discesa.
- Seleziona Database_Object_Estate da Nome della tabella o della vista casella a discesa.
Fare doppio clic su Informazioni database (Sorgente ADO.NET) in Editor Sorgente ADO.NET .
- Seleziona "TTI412-VM\SQL2017MonitoringDashboard ” dal Gestione connessioni ADO.NET casella a discesa.
- Seleziona Tabella o Visualizza dalla Modalità di accesso ai dati casella a discesa.
- Seleziona “Database_Estate ” dal Nome della tabella o della vista casella a discesa.
Fare doppio clic su Lavori SQL (Sorgente ADO.NET) in Editor Sorgente ADO.NET .
- Seleziona TTI412-VM\SQL2017MonitoringDashboard nella gestione connessione ADO.NET.
- Seleziona Tabella o Visualizza dalla Modalità di accesso ai dati casella a discesa.
- Seleziona SQL_Job_List nel Nome della tabella o della vista casella a discesa.
Ora trascina e rilascia tre destinazioni Excel da SSIS Toolbox. Vedi l'immagine seguente:
Una volta copiate le destinazioni, trascinare la freccia blu sotto l'origine ADO.Net e rilasciarla sulla destinazione Excel. Fai lo stesso per tutti. Vedi l'immagine seguente:
Fare doppio clic su Riepilogo oggetto Excel (Sorgente ADO.NET) nell' Editor di destinazione di Excel .
- Seleziona Excel Connection Manager da Gestione connessioni Excel casella a discesa.
- Seleziona Tabilita o Visualizza dalla Modalità di accesso ai dati casella a discesa.
- Seleziona Oggetto Summery$ dal Nome del foglio excel casella a discesa.
Come accennato, i nomi delle colonne della tabella SQL e delle colonne di Excel sono gli stessi, quindi la mappatura verrà eseguita automaticamente. Fai clic su Mappatura per mappare le colonne. Vedi l'immagine seguente:
Fare doppio clic su Informazioni sul database di Excel (Destinazione di Excel) in Editor di destinazione di Excel .
- Seleziona Excel Connection Manager da Gestione connessioni Excel casella a discesa.
- Seleziona Tabilita o Visualizza dalla Modalità di accesso ai dati casella a discesa.
- Seleziona Informazioni database$ dal Nome del foglio excel casella a discesa.
Come accennato, i nomi delle colonne della tabella SQL e delle colonne di Excel sono gli stessi, quindi la mappatura verrà eseguita automaticamente. Fai clic su Mappatura per mappare le colonne. Vedi l'immagine seguente:
Fare doppio clic su Excel SQL Jobs (Destinazione di Excel) in Editor di destinazione di Excel .
- Seleziona Excel Connection Manager da Gestione connessioni Excel casella a discesa.
- Seleziona Tabilita o Visualizza dalla Modalità di accesso ai dati casella a discesa.
- Seleziona "SQL Jobs$ dal Nome del foglio Excel casella a discesa.
Come accennato, i nomi delle colonne della tabella SQL e delle colonne di Excel sono gli stessi, quindi la mappatura verrà eseguita automaticamente. Fai clic su Mappatura per mappare le colonne. Vedi l'immagine seguente:
Crea un processo SQL per inviare via email il report del database
Una volta creato il pacchetto, crea un processo SQL per eseguire le seguenti attività:
- Esegui il pacchetto SSIS per popolare i dati da tutti i server.
- Invia il rapporto del database via email al team richiesto.
In SQL Job, dobbiamo creare due passaggi. Il primo passaggio eseguirà il pacchetto SSIS e il secondo passaggio eseguirà la procedura per inviare un'e-mail.
Per creare un processo SQL, apri SSMS>> SQL Server Agent>> Fare clic con il pulsante destro del mouse su Nuovo processo SQL .
Om il Nuovo lavoro procedura guidata, seleziona il Passaggio opzione e fai clic su Nessuno w. Nel nuovo passaggio di lavoro finestra di dialogo, nel passaggio nome casella di testo, fornire il nome desiderato, selezionare Pacchetto di servizi di integrazione di SQL Server dal Tipo casella a discesa. Fornisci una posizione del pacchetto SSIS nel Testo del pacchetto scatola. Vedi l'immagine seguente:
Fai clic su OK per chiudere Nuovo passaggio di lavoro .
Creare un altro passaggio di lavoro che eseguirà una procedura memorizzata per inviare il rapporto tramite e-mail. Utilizza una procedura di sistema per inviare un'e-mail. Il pacchetto SSIS copia le informazioni del database in una posizione specifica, quindi fornisce il percorso completo del file excel nel parametro @file_attachments di sp_send_dbmail procedura memorizzata.
Per creare la stored procedure, eseguire il codice seguente in DBATools database del server centrale:
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 fare un passo. 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 finestra. 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:
Summary
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.