0

为了从 SQL Server 代理发送自动作业失败通知,您必须配置数据库邮件,然后SQL Agent properties > Alert System > Mail Session > Enable mail profile配置mail systemmail profile用于发送电子邮件通知。我们有许多服务器,并希望设置一个中央跨服务器作业,以确保Enable mail profile跨多个服务器检查该选项,否则,计划的作业会在不发送电子邮件通知的情况下静默失败。

是否有支持的方式来查询msdb数据库以使用 T-SQL(或通过其他方式以编程方式)获取这些设置?

在 SQL Server 代理 UI 中打开属性页面时运行 SQL Profiler 跟踪会显示对msdb.dbo.sp_get_sqlagent_properties未记录过程的引用(我更愿意使用记录对象来帮助我们的解决方案面向未来),以及 master.dbo.xp_instance_regread我想象的几个调用每个 SQL Server 实例安装的 reg 键可能会发生变化。

有谁知道一种查询方法来检查该enable mail profile选项是否已配置,并检索mail profileSQL 代理警报系统配置中指定的选项?我们的大多数服务器都是 SQL Server 2008 R2,还有一些 SQL 2012。我更喜欢 SQL 2008+ 支持。

提前致谢!

4

3 回答 3

2

面向未来是一个非常明智的想法:)。正如您所指出的, xp_regread 和 xp_instance_regread 也都没有记录。http://social.msdn.microsoft.com/Forums/sqlserver/en-US/b83dd2c1-afde-4342-835f-c1debd73d9ba/xpregread解释了您的担忧(另外,它为您提供了另一种选择)。

您的跟踪和 sp_helptext 'sp_get_sqlagent_properties' 的运行是一个好的开始。接下来要做的是运行 sp_helptext 'sp_helptext',并注意它对 sys.syscomments 的引用。BOL sys.syscomments 主题将您重定向到 sys.sql_modules,这指向下一步。不幸的是,对于您的需要,运行 USE msdb 只会返回一行(用于“sp_get_sqlagent_properties”);SELECT object_name(object_id) FROM sys.sql_modules WHERE definition LIKE '%sp_get_sqlagent_properties%'。因此,我假设您不走运-似乎没有替代的,公开记录的模块(sproc)。我的假设可能是错误的:)。

我推断 xp_reg% 调用存在于客户端(SMO、SSMS 等)需求,例如设置/获取代理属性。更重要的是(根据您的需要),您的 sp_helptext 运行还显示 SSMS(客户端)正在使用注册表存储(即不是 SQL 存储)。不幸的是,我必须推断(基于图书馆搜索中缺乏证据)这些键(及其值)也没有记录在案......

以上似乎让你陷入困境。您可以决定“如果我们要依赖未记录的注册表项,我们不妨依赖未记录的调用来读取它们”,但我不建议这样做:)。您也可以在https://connect.microsoft.com/提交功能请求(您的需求很明确),但由于您的需求涉及客户端功能请求,我不建议您在等待修复时屏住呼吸: )。

也许是时候退后一步,看看更大的图景了:

  • 该密钥多久可以更改一次,该进程多久轮询一次该更改?

  • 电子邮件使用邮件原语。发件人:“亲爱的收件人,你收到我的邮件了吗?” 收件人:“亲爱的发件人,你给我发邮件了吗?” 禁用电子邮件配置文件并不是电子邮件失败的唯一原因。

与定期检查密钥相比,不同的方法会更有用吗?

一种方法是定期发送“KeepAlive”电子邮件。如果没有定期收到“KeepAlive”电子邮件,可能是那个键被调整了,可能邮局正在度假,或者可能发生了其他事情(同样糟糕)。此外,这种方法应该得到充分的支持、记录和面向未来。谁知道下一个版本的 SQL Server 代理将如何使用以及使用哪些密钥?

第一个项目符号没有得到解决(也不会通过定期检查密钥来解决),也许您还有其他需求(值得一提的是 MS connect)。

于 2014-04-09T17:40:11.033 回答
1

我终于找到了一种使用 PowerShell 和Microsoft.SqlServer.Management.Smo.Agent.JobServer.

这是我编写的 PowerShell 脚本,用于检查是否启用了 SQL 代理邮件警报,并确保在服务器重新启动时将 SQL 代理设置为自动启动。这适用于本地或远程 SQL 实例。

# usage examples
Check-SQLAgentConfiguration -InstanceName 'localhost\sql2014'
Check-SQLAgentConfiguration -InstanceName 'RemoteServerName'


function Check-SQLAgentConfiguration{
    param([string]$InstanceName='localhost')

    [System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO') | out-null;

    $smosrv = new-object Microsoft.SqlServer.Management.Smo.Server($InstanceName);
    $smosrv.ConnectionContext.ConnectTimeout = 5; #5 seconds timeout.
    $smosrv.ConnectionContext.ApplicationName = 'PowerShell Check-SQLAgentConfiguration';
    "Server: {0}, Instance: {1}, Version: {2}, Product Level: {3}" -f $smosrv.Name, $smosrv.InstanceName, $smosrv.Version, $smosrv.ProductLevel;

    # NOTE: this does not seem to ever fail even if SQL Server is offline.
    if(!$smosrv){"SQL Server Connection failed";  return $null;}   

    $agent = $smosrv.JobServer;

    if(!$agent -or $agent -eq $null){
        throw "Agent Connection failed";  
        return -2;
    }

    $agentConfigErrMsg = "";

    if($agent.AgentMailType -ne "DatabaseMail"){ $agentConfigErrMsg += " AgentMailType: " + $agent.AgentMailType + "; "; }
    if(!$agent.DatabaseMailProfile){$agentConfigErrMsg += " DatabaseMailProfile: " + $agent.DatabaseMailProfile + "; ";}
    if($agent.SqlAgentAutoStart -ne "True"){$agentConfigErrMsg += " SqlAgentAutoStart: " + $agent.SqlAgentAutoStart + " ServiceStartMode: " + $agent.ServiceStartMode + "; "; }

    if($agentConfigErrMsg.length -gt 0){
       $agentConfigErrMsg = "Invalid SQL Agent config! " + $agentConfigErrMsg; 
       throw $agentConfigErrMsg;
       return -1;
    }

    <##
    #for debugging:
    "Valid: "
    "AgentMailType:" + $agent.AgentMailType;
    "DatabaseMailProfile: " + $agent.DatabaseMailProfile;
    "ServiceStartMode: " + $agent.ServiceStartMode;
    "SqlAgentAutoStart: " + $agent.SqlAgentAutoStart;
    #"SqlAgentMailProfile: " + $agent.SqlAgentMailProfile;
    #>

    return 0; 
}
于 2015-07-24T18:25:20.443 回答
0

SQL 2008R2 使用类似服务代理的队列来处理邮件 ( http://technet.microsoft.com/en-us/library/ms175887%28v=sql.105%29.aspx )。在我们的环境中,我检查相应的队列是否存在并且处于活动状态。

SELECT * FROM msdb.sys.service_queues
WHERE name = N'ExternalMailQueue' 
AND is_receive_enabled = 1;

该表在线列出 ( http://technet.microsoft.com/en-us/library/ms187795%28v=sql.105%29.aspx )。

测试表明,当我们从新实例 -> 启用邮件 -> 邮件关闭并再次返回时,这会进行所需的转换。

于 2014-04-08T00:50:31.680 回答