Поделиться через


PERMISSIONS (Transact-SQL)

Возвращает битовую карту, указывающую разрешения на инструкции, объекты и столбцы для текущего пользователя.

Внимание!   В будущей версии Microsoft SQL Server эта возможность будет удалена. Избегайте использования этой возможности в новых разработках и запланируйте изменение существующих приложений, в которых она применяется. Вместо этого используйте процедуру fn_my_permissions и HAS_PERMS_BY_NAME (Transact-SQL). Постоянное использование функции 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

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 LOG

256

0x100

Зарезервировано

В следующей таблице приведены разряды, которым соответствуют разрешения на объекты, возвращаемые, только если указан аргумент objectid.

Разряд (дес.)

Разряд (шест.)

Разрешение на инструкцию

1

0x1

SELECT ALL

2

0x2

UPDATE ALL

4

0x4

REFERENCES ALL

8

0x8

INSERT

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

REFERENCES

Значение NULL возвращается, если указанный параметр представляет собой NULL или недействителен (например, объект, заданный аргументом objectid, или несуществующий столбец). Битовые значения для неприменимых разрешений (например, разрешение EXECUTE для таблицы, разряды 0x20) не определены.

Для определения каждого установленного бита в битовой карте, возвращаемой функцией PERMISSIONS, используйте оператор побитового AND (&).

Системная хранимая процедура 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.';

Б. Использование функции PERMISSIONS с разрешениями на объекты

В следующем примере определяется, может ли текущий пользователь вставить строку данных в таблицу Address, находящуюся в базе данных AdventureWorks.

IF PERMISSIONS(OBJECT_ID('AdventureWorks.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, находящейся в базе данных AdventureWorks, другому пользователю.

IF PERMISSIONS(OBJECT_ID('AdventureWorks.Person.Address','U'))&0x80000=0x80000
   PRINT 'INSERT on Person.Address is grantable.'
ELSE
   PRINT 'You may not GRANT INSERT permissions on Person.Address.';