我有一个连接字符串
<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数据库中是否有任何权限或角色?
最佳答案
了解 SQL Server login
(实例级别对象)和数据库user
(数据库级别对象)之间的区别非常重要。在您的连接字符串中,登录名为 UserA
,这可能会令人困惑。 “登录名”在数据库中没有权限。嗯,不是直接。这是登录映射到的具有权限的“用户”。好吧,够了...
SQL 登录
如果您的登录
具有sysadmin
角色成员资格,您将可以自由地执行任何操作,包括通过sp_send_dbmail
发送邮件。此查询将告诉您所连接的登录名是否具有该成员资格(查找返回值“1”):
SELECT IS_SRVROLEMEMBER('sysadmin', SUSER_NAME())
数据库用户 - 角色成员身份
但是,我怀疑您想知道您的登录
在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
登录拥有),作为数据库所有者,它几乎可以在数据库上执行任何事件。
数据库用户--个人资助
最后,我能想到另一种可能性:msdb 中的数据库用户可能不属于任何数据库角色,但可以明确授予执行 sp_send_dbmail
的权限,如下所示:
GRANT EXECUTE ON sp_send_dbmail TO [yourDBuser]
这将显示您的数据库用户已明确授予或拒绝了哪些权限:
USE msdb
GO
SELECT * FROM fn_my_permissions(NULL, 'DATABASE');
GO
关于sql-server - 如何检查 MSDB 的用户权限/角色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34664888/