首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何检查MSDB的用户权限/角色

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

Stack Overflow用户
提问于 2016-01-07 20:49:49
回答 1查看 7.2K关注 0票数 2

我有一个连接字符串

代码语言:javascript
复制
 <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数据库中是否具有任何权限或角色?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-08 15:55:28

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

SQL登录

如果您的login具有sysadmin角色成员资格,您将可以自由地做任何事情,包括通过sp_send_dbmail发送邮件。此查询将告诉您是否连接到与该成员身份相同的登录(查找返回值"1"):

代码语言:javascript
复制
SELECT IS_SRVROLEMEMBER('sysadmin', SUSER_NAME())

数据库用户-角色成员关系

但是,我怀疑您想知道您的login是否在msdb中有一个user,如果是的话,it是否有通过sp_send_dbmail发送邮件的权限。运行此查询,查看登录到的msdb中的哪个用户(如果有的话)以及用户所属的任何数据库角色:

代码语言:javascript
复制
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登录),并且作为数据库所有者,它几乎可以在db上执行任何活动。

数据库用户--个人赠款

最后,我还可以想到另一种可能性: msdb中的数据库用户可能不在任何数据库角色中,但可以显式地获得执行sp_send_dbmail的特权,如下所示:

代码语言:javascript
复制
GRANT EXECUTE ON sp_send_dbmail TO [yourDBuser]

这将向您展示哪些权限被显式授予或拒绝给数据库用户:

代码语言:javascript
复制
USE msdb
GO

SELECT * FROM fn_my_permissions(NULL, 'DATABASE');
GO
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34664888

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档