如何检查MSDB的用户权限/角色

时间:2016-01-07 20:49:50

标签: sql-server sp-send-dbmail

我有一个连接字符串

 <add name="DBCon" connectionString="Data Source=10.197.10.10,46512\Games;Initial Catalog=Games;User Id=UserA;Password=;" providerName="SqlMembershipProvider" />

在使用sp_send_dbmail和sql查询之前,如何检查UserA在msdb数据库中是否有任何权限或角色?

1 个答案:

答案 0 :(得分:2)

了解SQL Server login(实例级别对象)和数据库user(数据库级别对象)之间的区别非常重要。在您的连接字符串中,登录名为UserA,这可能会令人困惑。 &#34;登录&#34;没有数据库中的权限。好吧,不是直接。它是&#34;用户&#34;登录名映射到具有权限的登录名。好吧,够了......

SQL登录

如果您的login拥有sysadmin个角色会员资格,您可以免费执行任何操作,包括通过sp_send_dbmail发送邮件。此查询将告诉您您已连接的登录名是否具有该成员资格(查找&#34; 1&#34的返回值):

SELECT IS_SRVROLEMEMBER('sysadmin', SUSER_NAME())

数据库用户 - 角色成员资格

但是,我怀疑您是否想知道login usermsdb是否sp_send_dbmail,如果是, 允许通过msdb发送邮件。运行此查询以查看您的登录映射到的SELECT l.name LoginName, u.name UserName, r.name RoleName FROM master.sys.server_principals l JOIN msdb.sys.database_principals u ON u.sid = l.sid LEFT JOIN msdb.sys.database_role_members rm ON rm.member_principal_id = u.principal_id LEFT JOIN msdb.sys.database_principals r ON r.principal_id = rm.role_principal_id WHERE l.name = SUSER_NAME() AND r.name IN ('db_owner', 'DatabaseMailUser') (如果有)中的用户以及该用户所属的任何数据库角色:

db_owner

如果用户是DatabaseMailUsersp_send_dbmail的成员,则 应该能够执行DENY EXECUTE ON sp_send_dbmail TO [yourDBuser]。 (如果有明确的dbo,则用户将没有该权限。)

如果用户是msdb,那么它拥有sa(不太可能 - 系统数据库通常由sp_send_dbmail登录拥有),作为数据库所有者,它可以执行几乎关于db的任何活动。

数据库用户 - 个人拨款

最后,还有另一种我可以想到的可能性:msdb中的数据库用户可能不在任何数据库角色中,但可以明确地被赋予执行GRANT EXECUTE ON sp_send_dbmail TO [yourDBuser] 的权限,如下所示:

USE msdb
GO

SELECT * FROM fn_my_permissions(NULL, 'DATABASE');
GO

这将向您显示已向数据库用户明确授予或拒绝的权限:

a/b/c/d