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