私は現在、多数のサーバーを扱っており、それらには異なるデータベースメール構成があります。
これらのサーバーごとに データベースメール構成 を確認できます。
次のスクリプトを使用します。
--==========================================================
-- getting the Database Mail Configuration
-- Marcelo Miorelli
-- 1-April-2014
--==========================================================
select @@servername
--SQLSALON1\STOCKALLOCATION
-- http://dba.stackexchange.com/questions/47058/how-can-i-see-the-current-database-mail-configuration
EXEC msdb.dbo.sysmail_help_configure_sp;
EXEC msdb.dbo.sysmail_help_account_sp;
EXEC msdb.dbo.sysmail_help_profile_sp;
EXEC msdb.dbo.sysmail_help_profileaccount_sp;
EXEC msdb.dbo.sysmail_help_principalprofile_sp;
EXEC msdb.dbo.sysmail_help_account_sp
実際には、この点でmsdb.dbo.sysmail_help_account_sp
が私のお気に入りです。
ここで、前日のバックアップ履歴(完全バックアップと差分バックアップのみ)を電子メールで送信し、各サーバーのプロファイル名を確認する必要があります。
上記の手順の内容を一時テーブルまたはテーブル変数に保存し、必要なすべてのデータが揃い、メールで送信するまでに、情報を照会することで、これを実現したいと思います。
これらの手順、特にsysmail_help_account_spでそれを行うにはどうすればよいですか?
特にprofile name
を見つける必要があります。以下のスクリプトではDBA
を使用しました。
これは私が使用しているスクリプトです メールのコンテンツを生成するため :
--=====================================================================================================================
-- sql server backups report in HTML format to be emailed
--http://dba.stackexchange.com/questions/81432/how-do-i-use-powershell-to-get-a-sql-server-backup-status
--marcelo miorelli
--19-nov-2014
--=====================================================================================================================
DECLARE @Body VARCHAR(MAX),
@TableHead VARCHAR(MAX),
@TableTail VARCHAR(MAX)
SET NoCount ON ;
SET @TableTail = '</body></html>' ;
SET @TableHead = '<html><head>' + '<style>'
+ 'td {border: solid black 1px;padding-left:5px;padding-right:5px;padding-top:1px;padding-bottom:1px;font-size:10pt;} '
+ '</style>' + '</head>' + '<body>'
SELECT @Body = ''
SELECT @Body = @Body + '<table cellpadding=0 cellspacing=0 border=0>'
+ '<tr><td bgcolor=#E6E6FA>Database Name </td>'
+ '<td width="100px" bgcolor=#E6E6FA>Backup Size</td>'
+ '<td width="100px" bgcolor=#E6E6FA>Time Taken</td>'
+ '<td width="100px" bgcolor=#E6E6FA>Backup Start Date</td>'
+ '<td width="100px" bgcolor=#E6E6FA><b>First LSN</b></td>'
+ '<td width="100px" bgcolor=#E6E6FA><b>Last LSN</b></td>'
+ '<td width="100px" bgcolor=#E6E6FA><b>Backup Type</b></td>'
+ '<td width="100px" bgcolor=#E6E6FA><b>Server Name</b></td>'
+ '<td width="100px" bgcolor=#E6E6FA><b>Recovery Model</b></td>'
+ '<td width="300px" bgcolor=#E6E6FA>Physical Device Name</td> </tr>'
-- Backup History script of AAsim Adbullah
-- http://blog.sqlauthority.com/2010/11/10/sql-server-get-database-backup-history-for-a-single-database/
SELECT @Body = @Body
+ ( SELECT td = s.database_name, '',
td = CAST(CAST(s.backup_size / 1000000 AS INT) AS VARCHAR(14))+ ' ' + 'MB', '',
td = CAST(DATEDIFF(second, s.backup_start_date,
s.backup_finish_date) AS VARCHAR(4)) + ' ' + 'Seconds', '',
td = s.backup_start_date, '',
td = CAST(s.first_lsn AS VARCHAR(50)), '',
td = CAST(s.last_lsn AS VARCHAR(50)), '',
td = CASE s.[type]
WHEN 'D' THEN 'Full'
WHEN 'I' THEN 'Differential'
WHEN 'L' THEN 'Transaction Log'
END,'',
td = s.server_name, '',
td = s.recovery_model,'',
td = m.physical_device_name,''
FROM msdb.dbo.backupset s
INNER JOIN msdb.dbo.backupmediafamily m ON s.media_set_id = m.media_set_id
WHERE 1=1
AND s.backup_start_date >= DATEADD(dd, 0, DATEDIFF(dd, 0,GETDATE() - 1)) -- --- Date check for one day backup history information
AND s.[type] IN ('D','I') -- ignoring the transaction log backups
ORDER BY backup_start_date DESC,
backup_finish_date
FOR
XML PATH('tr')
) + '</table>'
SET @Body = REPLACE(@Body, '_x0020_', SPACE(1))
SET @Body = REPLACE(@Body, '_x003D_', '=')
SET @Body = REPLACE(@Body, '<tr><TRRow>1</TRRow>', '<tr bgcolor=#C6CFFF>')
SET @Body = REPLACE(@Body, '<TRRow>0</TRRow>', '')
SELECT @Body = @TableHead + @Body + @TableTail
--select @Body
IF ( @Body IS NULL )
BEGIN
EXEC msdb.dbo.sp_send_dbmail @recipients='[email protected]', -- Add Valid Email Id
@subject = 'Backup History Information',
@profile_name = 'DBA', -- Change Profile Name
@body = 'No Backup History Found for past 1 Day',
@body_format = 'HTML' ;
END
ELSE
Begin
EXEC msdb.dbo.sp_send_dbmail @recipients='[email protected]', -- Add Valid Email Id
@subject = 'Backup History Information',
@profile_name = 'DBA', -- Change Profile Name
@body = @Body,
@body_format = 'HTML' ;
END
これは実際には非常に簡単であり、INSERT... EXEC
ストアドプロシージャ。
USE msdb
EXEC sp_helptext 'sysmail_help_account_sp'
これはスクリプト情報を返します:
CREATE PROCEDURE dbo.sysmail_help_account_sp
@account_id int = NULL,
@account_name sysname = NULL
AS
SET NOCOUNT ON
DECLARE @rc int
DECLARE @accountid int
exec @rc = msdb.dbo.sysmail_verify_account_sp @account_id, @account_name, 1, 0, @accountid OUTPUT
IF @rc <> 0
RETURN(1)
IF (@accountid IS NOT NULL)
SELECT a.account_id, a.name, a.description, a.email_address, a.display_name, a.replyto_address, s.servertype, s.servername, s.port, s.username, s.use_default_credentials, s.enable_ssl
FROM msdb.dbo.sysmail_account a, msdb.dbo.sysmail_server s
WHERE a.account_id = s.account_id AND a.account_id = @accountid
ELSE
SELECT a.account_id, a.name, a.description, a.email_address, a.display_name, a.replyto_address, s.servertype, s.servername, s.port, s.username, s.use_default_credentials, s.enable_ssl
FROM msdb.dbo.sysmail_account a, msdb.dbo.sysmail_server s
WHERE a.account_id = s.account_id
RETURN(0)
Msdbでこれらのシステムビューをクエリするだけであることがわかります。
SELECT *
FROM msdb.dbo.sysmail_account a, msdb.dbo.sysmail_server s
WHERE a.account_id = s.account_id
プロセスに簡単に統合できるはずです。
お役に立てれば!
@ Erik Darling は、msdbテーブルからアカウント名を直接抽出する優れた方法を備えています。その方法を使用します。
ただし、INSERT INTO ... EXEC
構文の使用方法を理解しやすくするために、次の小さなコードスニペットを記述しました。
DECLARE @Command nvarchar(max);
DECLARE @params nvarchar(max);
DECLARE @ProfileName sysname;
DECLARE @ColumnList nvarchar(max);
DECLARE @tsql nvarchar(max);
SET @params = '@ProfileName sysname OUTPUT';
SET @tsql = N'EXEC msdb.dbo.sysmail_help_account_sp;'
SET @Command = N'CREATE TABLE #sysmailaccount
(
<COLUMNLIST>
);';
SET @ColumnList = '';
SET @ColumnList = STUFF((SELECT ', ' + QUOTENAME(rs.name) + ' ' + rs.system_type_name
FROM sys.dm_exec_describe_first_result_set(@tsql, NULL, NULL) rs
ORDER BY rs.column_ordinal
FOR XML PATH('')), 1, 2, '');
SET @Command = REPLACE(@Command, N'<COLUMNLIST>', @ColumnList);
SET @Command = @Command + N'
INSERT INTO #sysmailaccount
' + @tsql + N';
SELECT @ProfileName = sma.name
FROM #sysmailaccount sma;
';
EXEC sys.sp_executesql @Command, @params, @ProfileName = @ProfileName OUT;
SELECT ProfileName = @ProfileName;
上記のコードの最後に、最初のデータベースメールプロファイル名の名前を含む@ProfileName
があります。
コードはsys.dm_exec_describe_first_result_set
システム関数を使用して、msdb.dbo.sysmail_help_account_sp
の出力と同じ定義で一時テーブルを作成します。次に、sys.sp_executesql
を使用してINSERT INTO ... EXEC
コマンドを実行し、実際にsysmail_help_account_sp
ストアドプロシージャを実行して、出力を#sysmailaccount
一時テーブルに配置します。