📜  sql server 列出用户权限 - SQL (1)

📅  最后修改于: 2023-12-03 14:47:36.046000             🧑  作者: Mango

SQL Server 列出用户权限

在 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中查询用户权限的三种方法,分别是查询用户拥有的权限、查询对象的权限和查询用户的角色成员关系。通过这些方法,您可以轻松地了解到您的应用程序用户拥有哪些权限,并对此进行相应的管理和调整。