PERMISSIONS (Transact-SQL)
Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure
Возвращает битовую карту, указывающую разрешения на инструкции, объекты и столбцы для текущего пользователя.
Внимание
Эта функция будет удалена в будущей версии SQL Server. Избегайте использования этого компонента в новых разработках и запланируйте изменение существующих приложений, в которых он применяется. Вместо него используйте функции fn_my_permissions и Has_Perms_By_Name. Постоянное использование функции PERMISSIONS может привести к понижению производительности.
Соглашения о синтаксисе Transact-SQL
Синтаксис
PERMISSIONS ( [ objectid [ , 'column' ] ] )
Аргументы
objectid
Идентификатор защищаемого объекта. Если аргумент objectid не указан, то значение битовой карты содержит разрешения на выполнение инструкций для текущего пользователя; в противном случае битовая карта содержит разрешения в отношении защищаемого объекта для текущего пользователя. Указанный защищаемый объект должен находиться в текущей базе данных. Для определения значения аргумента objectid следует использовать функцию OBJECT_ID.
' column '
Необязательное имя столбца, для которого возвращаются данные о разрешениях. Имя столбца должно быть допустимым в таблице, указанной в аргументе objectid.
Типы возвращаемых данных
int
Замечания
С помощью функции PERMISSIONS можно определить, имеет ли текущий пользователь разрешения, необходимые для выполнения инструкции или предоставления разрешения другому пользователю с помощью инструкции GRANT.
Возвращаемые данные о разрешениях представляют собой 32-разрядную битовую карту.
Младшие 16 разрядов отражают разрешения, предоставленные пользователю, и разрешения, применяемые к группам Windows и предопределенным ролям сервера, членство в которых имеет текущий пользователь. Например, значение 66 (шестнадцатеричное значение 0x42), возвращаемое, если не задан аргумент objectid, указывает, что пользователь имеет разрешение выполнять инструкции CREATE TABLE (десятичное значение 2) и BACKUP DATABASE (десятичное значение 64).
Старшие 16 разрядов отражают разрешения, которые пользователь может предоставить другим пользователям с помощью инструкции GRANT. Старшие 16 разрядов интерпретируются точно так же, как и младшие 16 разрядов, описанные в следующих таблицах, но они сдвинуты влево на 16 разрядов (умножены на 65536). Например, 0x8 (десятичное значение 8) — бит, который означает разрешение INSERT, если указан аргумент objectid. А 0x80000 (десятичное значение 524288) указывает на возможность предоставления разрешения INSERT с помощью инструкции GRANT, так как 524288 = 8 x 65536.
Благодаря членству в ролях, пользователь, не имеющий разрешения выполнить инструкцию, может предоставить такое разрешение другому пользователю.
В таблице ниже приведены разряды, которым соответствуют разрешения на выполнение инструкций (аргумент objectid не указан).
Разряд (дес.) | Разряд (шест.) | Разрешение на инструкцию |
---|---|---|
1 | 0x1 | CREATE DATABASE (только в базе данных master) |
2 | 0x2 | СОЗДАТЬ ТАБЛИЦУ |
4 | 0x4 | СОЗДАТЬ ПРОЦЕДУРУ |
8 | 0x8 | СОЗДАТЬ ПРЕДСТАВЛЕНИЕ |
16 | 0x10 | CREATE RULE |
32 | 0x20 | CREATE DEFAULT |
64 | 0x40 | BACKUP DATABASE |
128 | 0x80 | BACKUP LOG |
256 | 0x100 | Зарезервировано |
В таблице ниже приведены разряды, которым соответствуют разрешения на объекты, возвращаемые, только если указан аргумент objectid.
Разряд (дес.) | Разряд (шест.) | Разрешение на инструкцию |
---|---|---|
1 | 0x1 | SELECT ALL |
2 | 0x2 | UPDATE ALL |
4 | 0x4 | REFERENCES ALL |
8 | 0x8 | ВСТАВИТЬ |
16 | 0x10 | DELETE |
32 | 0x20 | EXECUTE (только процедуры) |
4096 | 0x1000 | SELECT ANY (по крайней мере один столбец) |
8192 | 0x2000 | UPDATE ANY |
16384 | 0x4000 | REFERENCES ANY |
В таблице ниже приведены разряды, которым соответствуют разрешения на объекты уровня столбцов, возвращаемые, только если указаны аргумент objectid и столбец.
Разряд (дес.) | Разряд (шест.) | Разрешение на инструкцию |
---|---|---|
1 | 0x1 | SELECT |
2 | 0x2 | UPDATE |
4 | 0x4 | ССЫЛКИ |
Значение NULL возвращается, если указанный параметр представляет собой NULL или недопустим (например, объект, заданный аргументом objectid, или столбец не существуют). Битовые значения для неприменимых разрешений (например, разрешение EXECUTE для таблицы, разряды 0x20) не определены.
Для определения каждого установленного бита в битовой карте, возвращаемой функцией PERMISSIONS, используйте оператор побитового AND (&).
Системная хранимая процедура sp_helprotect также может быть использована для получения списка разрешений для пользователя в текущей базе данных.
Примеры
А. Использование функции 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
, находящуюся в базе данных AdventureWorks2022
.
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.';
В. Использование функции PERMISSIONS с разрешениями на выполнение инструкции GRANT
В следующем примере определяется, может ли текущий пользователь предоставить разрешение INSERT для таблицы Address
, находящейся в базе данных AdventureWorks2022
, другому пользователю.
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)