批量修改所有服务器的dbmail配置

不久前赶上这么一个案例,须要修改所有SQL
Server的Database Mail的SMTP,原来的SMTP为10.xxx.xxx.xxx,
现在急需修改为192.168.xxx.xxx,
别的必要规范邮件地址,以前那类邮件ServerName@yoursqldba.com的后缀须求修改为ServerName@xxxx.com(音讯做了脱敏处理)。

 

万一选取SSMS客户端的UI界面去修改的话,
那么多服务器一台一台去修改,不仅费时费劲,而且枯燥无聊。只能够利用脚本,一旦写好一个剧本,而后使用Multiple
Server Query
Execution(极力推荐使用那几个管理、维护数据库),执行三回剧本,全体搞定。剩下的时刻你可以喝喝茶、学习下新知识!

DECLARE @EmailAccount sysname;

DECLARE @SmtpServer sysname;

DECLARE @EmailAddress NVARCHAR(120);

DECLARE @EmailSuffix NVARCHAR(32);

DECLARE @NewEamilAddress NVARCHAR(120);

--DECLARE @ActualEmailSuffix NVARCHAR(32)='xxxx.com';  SQL Server 2005不支持此功能,会报Cannot assign a default value to a local variable.

DECLARE @ActualEmailSuffix NVARCHAR(32);

DECLARE @ActualSmtpServer sysname;

 

SET @ActualEmailSuffix='xxx.com';

SET @ActualSmtpServer='192.168.xxx.xxx';

 

DECLARE EmailAccount_Cursor CURSOR FAST_FORWARD

FOR

SELECT sa.[name]        

      ,ss.[servername] 

      ,sa.email_address

  FROM [msdb].[dbo].[sysmail_server] ss 

  INNER JOIN [msdb].[dbo].[sysmail_account] sa

  ON ss.[account_id]=sa.[account_id];

 

 

OPEN EmailAccount_Cursor;

 

FETCH NEXT FROM EmailAccount_Cursor INTO @EmailAccount, @SmtpServer,@EmailAddress;

 

WHILE @@FETCH_STATUS = 0

BEGIN

 

    IF LTRIM(RTRIM(@SmtpServer))!=@ActualSmtpServer

    BEGIN

        

 

        EXECUTE msdb.dbo.sysmail_update_account_sp

             @account_name = @EmailAccount

            ,@mailserver_name=@ActualSmtpServer;

        

        PRINT @SmtpServer;

        PRINT @EmailAccount;

    END;

 

    SET @EmailSuffix=SUBSTRING(@EmailAddress,CHARINDEX('@',@EmailAddress)+1, LEN(@EmailAddress) -CHARINDEX('@',@EmailAddress))

 

    IF @EmailSuffix!=@ActualEmailSuffix

    BEGIN

        SET @NewEamilAddress= REPLACE(@EmailAddress,@EmailSuffix,@ActualEmailSuffix);

 

        EXECUTE msdb.dbo.sysmail_update_account_sp

             @account_name = @EmailAccount

            ,@email_address=@NewEamilAddress

            ,@mailserver_name=@SmtpServer;

 

        PRINT @EmailAccount;

        PRINT @NewEamilAddress;

 

 

    END;

 

    FETCH NEXT FROM EmailAccount_Cursor INTO @EmailAccount, @SmtpServer,@EmailAddress;

END

 

CLOSE EmailAccount_Cursor;

 

DEALLOCATE EmailAccount_Cursor;

相关文章