📅  最后修改于: 2023-12-03 14:47:36.046000             🧑  作者: Mango
在 SQL Server 中,有时需要查询用户拥有哪些权限以及这些权限对哪些对象生效。下面介绍一些查询语句,以帮助您列出用户权限。
您可以通过以下语句查询一个用户拥有的权限:
USE <database>;
SELECT *
FROM sys.fn_my_permissions(NULL, 'DATABASE')
WHERE grantee_principal_id = USER_ID('username');
该语句将返回一个结果集,其中包含用户拥有的权限、权限类型、对象名称和模式以及是否授予了 WITH GRANT OPTION 权限。使用此语句时,需将 <database>
替换为要查询的数据库名称,将 username
替换为要查询的用户名。
您可以通过以下语句查询一个对象的权限:
USE <database>;
SELECT *
FROM sys.database_permissions
WHERE class_desc = 'OBJECT_OR_COLUMN'
AND major_id = OBJECT_ID('<schema>.<object>');
该语句将返回一个结果集,其中包含该对象所拥有的所有权限、授权用户或角色以及授权模式(GRANT 或 DENY)。使用此语句时,需将 <database>
替换为要查询的数据库名称,将 <schema>
和 <object>
分别替换为要查询的对象所在的模式和名称。
您可以通过以下语句查询一个用户所属的角色及其层次结构:
USE <database>;
WITH role_members (role_principal_id, member_principal_id, depth)
AS (
SELECT roles.principal_id, members.principal_id, 0
FROM sys.database_role_members AS members
INNER JOIN sys.database_principals AS roles
ON members.role_principal_id = roles.principal_id
WHERE members.member_principal_id = USER_ID('username')
UNION ALL
SELECT roles.principal_id, members.principal_id, roles.depth + 1
FROM sys.database_role_members AS members
INNER JOIN sys.database_principals AS roles
ON members.role_principal_id = roles.principal_id
INNER JOIN role_members
ON members.member_principal_id = role_members.role_principal_id
WHERE roles.depth < 100
)
SELECT DISTINCT
roles.name AS role_name,
role_members.depth,
members.name AS member_name
FROM role_members
INNER JOIN sys.database_principals AS roles
ON role_members.role_principal_id = roles.principal_id
INNER JOIN sys.database_principals AS members
ON role_members.member_principal_id = members.principal_id
ORDER BY depth, roles.name;
该语句将返回一个结果集,其中包含用户所属的所有角色及其层次结构。使用此语句时,需将 <database>
替换为要查询的数据库名称,将 username
替换为要查询的用户名。
本文介绍了SQL Server中查询用户权限的三种方法,分别是查询用户拥有的权限、查询对象的权限和查询用户的角色成员关系。通过这些方法,您可以轻松地了解到您的应用程序用户拥有哪些权限,并对此进行相应的管理和调整。