如何检查用户 Permissions/Roles 的 MSDB
How to Check MSDB for User Permissions/Roles
我有一个连接字符串
<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 服务器 login
(实例级对象)和数据库 user
(数据库级对象)之间的区别很重要。在您的连接字符串中,登录名为 UserA
,这可能会造成混淆。 "Logins" 在数据库中没有权限。嗯,不是直接 。登录映射到具有权限的是 "user"。好了,够了...
SQL 登录
如果您的 login
具有 sysadmin
角色成员资格,您将可以自由地做任何事情,包括通过 sp_send_dbmail
发送邮件。此查询将告诉您您所连接的登录名是否具有该成员资格(查找 return 值“1”):
SELECT IS_SRVROLEMEMBER('sysadmin', SUSER_NAME())
数据库用户 - 角色成员资格
但是,我怀疑您想知道您的 login
是否在 msdb
中有一个 user
,如果有, 它 有权通过 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
登录名拥有),并且作为数据库所有者,它几乎可以在数据库上执行任何 activity。
数据库用户--个人授权
最后,我能想到的另一种可能性是:msdb 中的数据库用户可能不属于任何数据库角色,但可以明确授予执行 sp_send_dbmail
的权限,如下所示:
GRANT EXECUTE ON sp_send_dbmail TO [yourDBuser]
这将向您显示哪些权限已明确授予或拒绝给您的数据库用户:
USE msdb
GO
SELECT * FROM fn_my_permissions(NULL, 'DATABASE');
GO
我有一个连接字符串
<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 服务器 login
(实例级对象)和数据库 user
(数据库级对象)之间的区别很重要。在您的连接字符串中,登录名为 UserA
,这可能会造成混淆。 "Logins" 在数据库中没有权限。嗯,不是直接 。登录映射到具有权限的是 "user"。好了,够了...
SQL 登录
如果您的 login
具有 sysadmin
角色成员资格,您将可以自由地做任何事情,包括通过 sp_send_dbmail
发送邮件。此查询将告诉您您所连接的登录名是否具有该成员资格(查找 return 值“1”):
SELECT IS_SRVROLEMEMBER('sysadmin', SUSER_NAME())
数据库用户 - 角色成员资格
但是,我怀疑您想知道您的 login
是否在 msdb
中有一个 user
,如果有, 它 有权通过 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
登录名拥有),并且作为数据库所有者,它几乎可以在数据库上执行任何 activity。
数据库用户--个人授权
最后,我能想到的另一种可能性是:msdb 中的数据库用户可能不属于任何数据库角色,但可以明确授予执行 sp_send_dbmail
的权限,如下所示:
GRANT EXECUTE ON sp_send_dbmail TO [yourDBuser]
这将向您显示哪些权限已明确授予或拒绝给您的数据库用户:
USE msdb
GO
SELECT * FROM fn_my_permissions(NULL, 'DATABASE');
GO