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

标签 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数据库中是否有任何权限或角色?

最佳答案

了解 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_ownerDatabaseMailUser 的成员,则它应该能够执行 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/

相关文章:

sql-server - 使用nodes()方法分解XML

sql-server - sp_send_dbmail不会发送查询结果

sql-server - 为什么 Sql Server Agent Job 会发送重复的电子邮件?

sql - 如何从存储过程发送邮件?

Java - 以编程方式添加 SQL Azure 防火墙规则

sql-server - 如何在 SQL Server 中结合水平和垂直分区

sql - sp_send_dbmail 附加在数据库中存储为 varbinary 的文件

sql - 为什么在使用数据库邮件时出现以下错误 -> 过程 sysmail_verify_profile_sp,配置文件名称无效?

sql-server - 无法删除数据库用户,因为该用户当前已登录。错误15434

mysql - 链接服务器更新mysql不工作