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

Sql server 如何检查MSDB中的用户权限/角色,sql-server,sp-send-dbmail,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 Serve

我有一个连接字符串

 <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
登录(实例级对象)和数据库
用户
(数据库级对象)之间的区别非常重要。在您的连接字符串中,登录名为
UserA
,这可能会造成混淆。“登录”在数据库中没有权限。嗯,不是直接的。登录映射到的具有权限的“用户”。好了,够了

SQL登录

如果您的
登录名
具有
系统管理员
角色成员资格,则您可以自由地执行任何操作,包括通过
sp\u send\u dbmail
发送邮件。此查询将告诉您所连接的登录名是否具有该成员身份(查找返回值“1”):

数据库用户-角色成员身份

但是,我怀疑您想知道您的
登录名
msdb
中是否有
用户
,如果是,它是否有权通过
sp\u send\u 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\u owner
DatabaseMailUser
的成员,则应该能够执行
sp\u send\u dbmail
。(如果在sp_send_dbmail TO[yourDBuser]
上有一个明确的
拒绝执行,则用户将没有该权限。)

如果用户是
dbo
,那么它拥有
msdb
(不太可能——系统数据库通常由
sa
登录名拥有),并且作为数据库所有者,它可以在数据库上执行几乎任何活动

数据库用户--个人授权

最后,我可以想到另一种可能性:msdb中的数据库用户可能没有任何数据库角色,但可以明确地被授予执行
sp\u send\u dbmail
的权限,如下所示:

GRANT EXECUTE ON sp_send_dbmail TO [yourDBuser]
这将显示明确授予或拒绝数据库用户的权限:

USE msdb
GO

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

为了澄清,您想知道
UserA
是否有权执行
sp\u send\u dbmail
。这就是问题所在吗?@DMason,没错。也许我应该打电话给用户Id,UserIdA。您出色的解释回避了一个问题:如何找到登录名(连接字符串中)映射到的“用户”,以便找到该隐式用户可能拥有或可能没有的权限?我使用Windows身份验证访问sql server,但应用程序只知道连接字符串。@usefulBee,它是数据库用户-角色成员身份标题下的查询。尝试注释掉最后一行(
和…
中的r.name),然后重新运行查询。如果有一个db用户映射到您的登录,您将返回至少一行。如果没有db用户映射到登录,则不会返回任何行。是的,但是,为了得到任何结果,我还必须对第一个条件进行注释。我看到了一些,“sa”是其中之一,但没有任何与我的登录匹配的。非常感谢您的洞察力
其中l.name=SUSER\u name()
…是的,这无疑增加了混淆。内置函数
SUSER\u NAME()
返回SQL登录名,而不是数据库用户的名称。(有点误导性的函数名,对吧?)如果您单独运行
SELECT SUSER\u name()
,它应该返回您的SQL登录名(不管是SQL身份验证还是Windows身份验证)。我在我的示例中使用了它,因此查询只会返回您登录的信息。HTHSELECT SUSER_NAME()非常有用!
USE msdb
GO

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