sys.fn_my_permissions (Transact-SQL)

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse AnalyticsAnalytics Platform System (PDW)Microsoft Fabric 中的 SQL 终结点Microsoft Fabric 中的仓库

返回有效授予主体对安全对象的权限的列表。 一个相关的函数是 HAS_PERMS_BY_NAME

Transact-SQL 语法约定

语法

fn_my_permissions ( securable , 'securable_class' )  

参数

securable

安全对象的名称。 如果安全对象为服务器或数据库,则该值应设置为 NULL。 securable 是 sysname 类型的标量表达式。 securable 可以是由多个部分构成的名称。

'securable_class'

为其列出权限的安全对象的类的名称。 securable_class 是 sysname。 securable_class 必须为下列值之一:APPLICATION ROLE、ASSEMBLY、ASYMMETRIC KEY、CERTIFICATE、CONTRACT、DATABASE、ENDPOINT、FULLTEXT CATALOG、LOGIN、MESSAGE TYPE、OBJECT、REMOTE SERVICE BINDING、ROLE、ROUTE、SCHEMA、SERVER、SERVICE、SYMMETRIC KEY、TYPE、USER、XML SCHEMA COLLECTION。

返回的列

下表列出了返回的 fn_my_permissions 列。 返回的每一行说明了当前安全上下文拥有的对安全对象的一种权限。 如果查询失败,则返回 NULL

列名称 类型 说明
entity_name sysname 对其有效授予所列权限的安全对象的名称。
subentity_name sysname 如果安全对象具有列,则为列名,否则 NULL为列名。
permission_name nvarchar 权限的名称。

备注

该表值函数返回调用主体持有的对指定安全对象的有效权限的列表。 有效权限包括下列任何一种权限:

  • 直接授予主体并且不被拒绝的权限。

  • 由主体持有的更高级权限暗含的、且不被拒绝的权限。

  • 授予主体所属的角色或组的、且不被拒绝的权限。

  • 由主体所属的角色或组持有的、且不被拒绝的权限。

权限评估始终在调用方的安全上下文中执行。 若要确定其他某个主体是否具有有效的权限,调用方必须对该主体具有 IMPERSONATE 权限。

对于架构级实体,可接受由一部分、两部分或三部分组成的非空名称。 对于数据库级实体,只接受由一部分组成的名称,Null 表示“当前数据库”。 对于服务器本身,则需要一个 Null(表示“当前服务器”)。 fn_my_permissions 无法检查链接服务器上的权限。

以下查询将返回内置安全对象类的列表:

SELECT DISTINCT class_desc FROM fn_builtin_permissions(default)  
    ORDER BY class_desc;  
GO  

如果DEFAULT作为安全对象securable_class的值提供,该值将被解释为 NULL

Azure Synapse Analytics 专用 SQL 池不支持该 fn_my_permissions 函数。

权限

要求具有 public 角色的成员身份。

示例

A. 列出对服务器的有效权限

以下示例返回调用方对服务器的有效权限的列表。

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

B. 列出对数据库的有效权限

以下示例返回调用方对 AdventureWorks2022 数据库的有效权限的列表。

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

C. 列出对视图的有效权限

以下示例返回调用方对 AdventureWorks2022 数据库内 vIndividualCustomer 架构中 Sales 视图的有效权限的列表。

USE AdventureWorks2022;  
SELECT * FROM fn_my_permissions('Sales.vIndividualCustomer', 'OBJECT')   
    ORDER BY subentity_name, permission_name ;   
GO   

D. 列出另一个用户的有效权限

以下示例返回数据库用户 WanidaAdventureWorks2022 数据库内 Employee 架构中 HumanResources 表的有效权限的列表。 调用方需要对用户 Wanida 具有 IMPERSONATE 权限。

EXECUTE AS USER = 'Wanida';  
SELECT * FROM fn_my_permissions('HumanResources.Employee', 'OBJECT')   
    ORDER BY subentity_name, permission_name ;    
REVERT;  
GO  

E. 列出对证书的有效权限

以下示例返回调用方对当前数据库中证书 Shipping47 的有效权限的列表。

SELECT * FROM fn_my_permissions('Shipping47', 'CERTIFICATE');  
GO  

F. 列出对 XML 架构集合的有效权限

以下示例返回调用方对 AdventureWorks2022 数据库中 XML 架构集合 ProductDescriptionSchemaCollection 的有效权限的列表。

USE AdventureWorks2022;  
SELECT * FROM fn_my_permissions('ProductDescriptionSchemaCollection',  
    'XML SCHEMA COLLECTION');  
GO  

G. 列出对数据库用户的有效权限

以下示例返回调用方对当前数据库中用户 MalikAr 的有效权限的列表。

SELECT * FROM fn_my_permissions('MalikAr', 'USER');  
GO  

H. 列出另一个登录名的有效权限

以下示例返回 SQL Server 登录 WanidaBenshoofAdventureWorks2022 数据库内 HumanResources 架构中 Employee 表的有效权限的列表。 调用方需要对 SQL Server 登录 WanidaBenshoof 具有 IMPERSONATE 权限。

EXECUTE AS LOGIN = 'WanidaBenshoof';  
SELECT * FROM fn_my_permissions('AdventureWorks2022.HumanResources.Employee', 'OBJECT')   
    ORDER BY subentity_name, permission_name ;    
REVERT;  
GO  

后续步骤