Has_Perms_By_Name (Transact-SQL)
评估当前用户对安全对象的有效权限。
Has_perms_by_name (
securable ,
securable_class ,
permission
[ , sub-securable ]
[ , sub-securable_class ]
)
- securable
安全对象名。如果安全对象是服务器本身,则此值应设置为 NULL。securable 是类型为 sysname 的标量表达式。没有默认值。
- securable_class
测试权限的安全对象的类名。securable_class 是类型为 nvarchar(60) 的标量表达式。
- permission
类型为 sysname 的非空标量表达式,表示要检查的权限名称。没有默认值。权限名称 ANY 是通配符。
- sub-securable
类型为 sysname 的可选标量表达式,表示测试权限的安全对象子实体的名称。默认值为 NULL。
- sub-securable_class
类型为 nvarchar(60) 的可选标量表达式,表示测试权限的安全对象子实体的类。默认值为 NULL。
int
如果查询失败,则返回 NULL。
此内置函数将测试当前主体对于指定的安全对象是否具有特定的有效权限。有效权限可以是下列任意一种:
- 直接授予主体且不被拒绝的权限。
- 由主体持有的更高级权限暗含的、且不被拒绝的权限。
- 授予主体所属的角色或组的、且不被拒绝的权限。
- 由主体所属的角色或组持有的、且不被拒绝的权限。
权限评估始终在调用方的安全上下文中执行。若要确定某些其他用户是否具有有效权限,调用方必须对此用户具有 IMPERSONATE 权限。
对于架构级实体,可接受由一部分、两部分或三部分组成的非空名称。对于数据库级实体,只接受由一部分组成的名称,空值表示“当前数据库”。对于服务器本身,则需要一个空值(表示“当前服务器”)。This function cannot check permissions on a linked server or on a Windows user for which no server-level principal has been created.
以下查询将返回内置安全对象类的列表:
SELECT class_desc FROM sys.fn_builtin_permissions(default)
使用以下排序规则:
- 当前数据库排序规则:包括架构未包含的安全对象的数据库级安全对象;由一部分或两部分组成的架构范围内的安全对象;使用由三部分组成的名称时的目标数据库。
- master 数据库排序规则:服务器级安全对象。
- 列级别检查不支持“ANY”。必须指定合适的权限。
SELECT has_perms_by_name(null, null, 'VIEW SERVER STATE');
SELECT has_perms_by_name('Ps', 'LOGIN', 'IMPERSONATE')
SELECT has_perms_by_name(db_name(), 'DATABASE', 'ANY')
假定调用方对主体 Pd
有 IMPERSONATE 权限。
EXECUTE AS user = 'Pd'
GO
SELECT has_perms_by_name(db_name(), 'DATABASE', 'ANY')
GO
REVERT
GO
以下示例需要在 S
中具有 ALTER
权限,在数据库中具有 CREATE PROCEDURE
权限,表的情况与此类似。
SELECT has_perms_by_name(db_name(), 'DATABASE', 'CREATE PROCEDURE')
& has_perms_by_name('S', 'SCHEMA', 'ALTER') AS _can_create_procs,
has_perms_by_name(db_name(), 'DATABASE', 'CREATE TABLE') &
has_perms_by_name('S', 'SCHEMA', 'ALTER') AS _can_create_tables;
SELECT has_perms_by_name(SCHEMA_NAME(schema_id) + '.' + name,
'OBJECT', 'SELECT') AS have_select, * FROM sys.tables;
以下示例假定 AdventureWorks
为我的当前数据库上下文,并使用由两部分组成的名称。
SELECT has_perms_by_name('Sales.SalesPerson', 'OBJECT', 'INSERT')
以下示例对我的当前数据库上下文未做任何假定,并使用由三部分组成的名称。
SELECT has_perms_by_name('AdventureWorks.Sales.SalesPerson',
'OBJECT', 'INSERT')
SELECT name AS column_name,
has_perms_by_name('T', 'OBJECT', 'SELECT', name, 'COLUMN')
AS can_select FROM sys.columns AS c
WHERE c.object_id=object_id('T');
sys.fn_builtin_permissions (Transact-SQL)
安全性目录视图 (Transact-SQL)