适用于:SQL Server
Azure SQL 数据库
Azure SQL 托管实例
Microsoft Fabric 中的 SQL 数据库
返回一个包含位图的值,该值指示当前用户的语句、对象或列权限。
重要
在 SQL Server的未来版本中将删除此功能。 请避免在新的开发工作中使用该功能,并着手修改当前还在使用该功能的应用程序。 请改用 fn_my_permissions 和 Has_Perms_By_Name。 继续使用 PERMISSIONS 函数可能导致性能降低。
语法
PERMISSIONS ( [ objectid [ , 'column' ] ] )
参数
objectid
安全对象的 ID。 如果未指定 objectid,则位图值包含当前用户的语句权限;否则,位图包含当前用户对该安全对象的权限。 指定的安全对象必须在当前数据库中。 使用 OBJECT_ID 函数确定 objectid 值。
'column'
返回其权限信息的列的可选名。 该列必须是 objectid 指定的表中的有效列名。
返回类型
int
备注
权限可以用来判断当前用户是否拥有执行语句或 GRANT 对其他用户权限的权限。
所返回的权限信息是 32 位位图。
低 16 位反映授予用户的权限,以及应用于 Windows 组或当前用户属于其成员的固定服务器角色的权限。 例如,当未指定 objectid 时返回的值为66(十六进制值0x42,表示用户有权执行 CREATE TABLE (十进制值2)和 BACKUPDATABASE (十进制值64)语句。
上方16位代表用户对其他用户的 GRANT 权限。 除左移 16 位(与 65536 相乘)之外,高 16 位的解释方式与下表中所介绍的低 16 位的解释方式完全相同。 例如,0x8(小数值8)是指定objectid时表示INSERT许可的比特。 而0x80000(小数值524288)表示权限, GRANTINSERT 因为524288 = 8 x 65536。
由于角色中的成员身份,没有执行语句权限的用户仍然可以将该权限授予其他用户。
下表显示语句权限所使用的位(未指定 objectid)。
| 位(十进制) | 位(十六进制) | 语句权限 |
|---|---|---|
| 1 | 0x1 | CREATE DATABASE (仅限主数据库) |
| 2 | 0x2 | CREATE TABLE |
| 4 | 0x4 | CREATE PROCEDURE |
| 8 | 0x8 | CREATE VIEW |
| 16 | 0x10 | CREATE RULE |
| 32 | 0x20 | CREATE DEFAULT |
| 64 | 0x40 | BACKUP DATABASE |
| 128 | 0x80 | BACKUP 日志 |
| 256 | 0x100 | 保留 |
下表显示当仅指定 objectid 时,返回的对象权限所使用的位。
| 位(十进制) | 位(十六进制) | 语句权限 |
|---|---|---|
| 1 | 0x1 | 全部选择 |
| 2 | 0x2 | UPDATE 全部 |
| 4 | 0x4 | 所有参考资料 |
| 8 | 0x8 | INSERT |
| 16 | 0x10 | DELETE |
| 32 | 0x20 | EXECUTE(仅限于过程) |
| 4096 | 0x1000 | SELECT ANY(至少一列) |
| 8192 | 0x2000 | UPDATE 任何 |
| 16384 | 0x4000 | 参考文献 任何 |
下表显示当同时指定 objectid 和列时,返回的列级对象权限所使用的位。
| 位(十进制) | 位(十六进制) | 语句权限 |
|---|---|---|
| 1 | 0x1 | SELECT |
| 2 | 0x2 | UPDATE |
| 4 | 0x4 | REFERENCES |
如果指定的参数为 NULL 或无效(例如,objectid 或列不存在),则返回 NULL。 没有定义不适用的权限所使用的位值(例如,表的 EXECUTE 权限、位 0x20)。
使用位与 (&) 运算符确定 PERMISSIONS 函数返回的位图中的每个位集。
还可使用 sp_helprotect 系统存储过程返回某用户在当前数据库中的权限列表。
示例
A. 对语句权限使用 PERMISSIONS 函数
以下示例确定当前用户能否执行 CREATE TABLE 语句。
IF PERMISSIONS()&2=2
CREATE TABLE test_table (col1 INT)
ELSE
PRINT 'ERROR: The current user cannot create a table.';
B. 对对象权限使用 PERMISSIONS 函数
以下示例确定当前用户能否在 Address 数据库的 AdventureWorks2025 表中插入数据行。
IF PERMISSIONS(OBJECT_ID('AdventureWorks2022.Person.Address','U'))&8=8
PRINT 'The current user can insert data into Person.Address.'
ELSE
PRINT 'ERROR: The current user cannot insert data into Person.Address.';
C. 对可授予的权限使用 PERMISSIONS 函数
以下示例决定当前用户是否可以将数据库中AdventureWorks2025表的权限Address授予INSERT其他用户。
IF PERMISSIONS(OBJECT_ID('AdventureWorks2022.Person.Address','U'))&0x80000=0x80000
PRINT 'INSERT on Person.Address is grantable.'
ELSE
PRINT 'You may not GRANT INSERT permissions on Person.Address.';
另请参阅
DENY (Transact-SQL)
GRANT (Transact-SQL)
OBJECT_ID(Transact-SQL)
REVOKE (Transact-SQL)
sp_helprotect(Transact-SQL)
系统函数 (Transact-SQL)