我有一个连接字符串
<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数据库中是否有任何权限或角色?
答案 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
user
中msdb
是否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
如果用户是DatabaseMailUser
或sp_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