我们有一个监控工具,可以检查 Microsoft SQL Server 作业是否成功运行。我想要做的是创建一个权限尽可能少的用户,但它必须能够查看历史日志以查看作业是否完成。
我应该为用户分配什么角色?
编辑:服务器是 Microsoft SQL Server 2005 到 2012
我们有一个监控工具,可以检查 Microsoft SQL Server 作业是否成功运行。我想要做的是创建一个权限尽可能少的用户,但它必须能够查看历史日志以查看作业是否完成。
我应该为用户分配什么角色?
编辑:服务器是 Microsoft SQL Server 2005 到 2012
为了能够检查您需要的所有作业,请将用户添加到 msdb 数据库中的SQLAgentReaderRole中,这也授予该用户创建作业的权限。要最小化授予的访问权限,您还可以授予用户对 sql server 代理使用的表的选择权限
如果“查看历史日志以查看作业是否完成”可以通过使用存储过程、标量函数或表值函数(而不是直接
SELECT
访问msdb.dbo.sysjob*
表)来完成,那么您可以在不授予任何权限的情况下逃脱对将要登录的任何真实登录名/用户完全拥有权限。您仍将创建至少一个登录名,并且可能还创建一个用户(但可能不会),但任何人或应用程序代码都不会使用此登录名连接到 SQL Server . 这个想法是使用模块签名通过代理/间接授予权限。我在以下答案中详细介绍了该方法(嗯,这是此特定用法的第一部分):我需要向用户提供哪些最低权限才能检查 SQL Server 代理服务的状态?
此案例与该答案中的案例之间的区别在于,查看 DMV 信息所需的服务器级别权限不是服务器级别的权限,而是这里需要数据库级别的角色。因此,超出链接答案中讨论的其他步骤是:
VIEW SERVER STATE
登录服务器级权限msdb
msdb
从该证书创建用户msdb
数据库角色SQLAgentReaderRole
如果您想一次只检查一个作业,您可以创建一个接受作业名称参数的存储过程或标量函数。或者,如果您想获取多个作业的状态,您可以创建一个表值函数。在这两种情况下,您都在该存储过程或函数中提供查询,并仅向任何人授予对该存储过程或函数的访问权限。此方法允许您仅授予对该查询的访问权限,而不是该
SQLAgentReaderRole
角色所暗示的任何其他内容。或者,您可以通过为任何所需查询所需的每个表创建一个表值函数(或者某些 JOIN 可以在某些 TVF 中完成)并对其进行签名,从而允许更自由形式的即席查询访问。然后,您授予
SELECT
这些 TVF 权限的任何人都可以进行自己的查询。唯一的缺点是 TVF 需要是多语句的并且不能是内联 TVF,但对于这种特殊情况,在大多数情况下应该没问题,因为这些查询不应该每秒运行多次;-)。