HAS_PERMS_BY_NAME (Transact-SQL)

Оценивает действующие разрешения текущего пользователя для защищаемого объекта. Связанная функция — fn_my_permissions.

Применимо для следующих объектов: SQL Server (SQL Server 2008 по текущую версию), База данных SQL Windows Azure (С первоначального выпуска по текущий выпуск).

Значок ссылки на раздел Cинтаксические обозначения в 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).

    В База данных SQL Windows Azure аргумент securable_class должен быть задан равным одному из следующих значений: DATABASE, OBJECT, ROLE, SCHEMA или USER.

  • permission
    Скалярное выражение типа sysname, отличное от NULL, представляющее проверяемые разрешения. Значение по умолчанию отсутствует. Имя разрешения ANY является шаблоном для подстановки.

  • sub-securable
    Необязательное скалярное выражение типа sysname, представляющее имя защищаемой вложенной сущности, у которой проверяются разрешения. Значение по умолчанию: NULL.

    Примечание

    В версиях SQL Server – SQL Server 2014 для вложенных защищаемых объектов не могут использоваться квадратные скобки в форме «[sub name.Вместо этого используйте «sub name».

  • sub-securable_class
    Необязательное скалярное выражение типа nvarchar(60), представляющее класс защищаемой вложенной сущности, относительно которой проверяются разрешения. Значение по умолчанию — NULL.

    В База данных SQL Windows Azure аргумент sub-securable_class является допустимым, только если аргумент securable_class задан равным OBJECT. Если аргумент securable_class задан равным OBJECT, то аргумент sub-securable_class должен быть задан равным COLUMN.

Типы возвращаемых данных

int

Возвращает значение NULL, если запрос завершается неудачей.

Замечания

Данная встроенная функция проверяет наличие у текущего участника определенного действующего разрешения для указанного защищаемого объекта. Функция HAS_PERMS_BY_NAME возвращает значение 1, если пользователь имеет действующее разрешение на защищаемый объект, значение 0, если пользователь не имеет действующего разрешения на защищаемый объект, либо значение NULL, если класс защищаемого объекта или разрешение недопустимы. Допустимыми являются следующие действующие разрешения.

  • Действующее разрешение, предоставленное непосредственно участнику.

  • Действующее разрешение, следующее из разрешений более высокого уровня, которыми обладает участник.

  • Действующее разрешение, предоставленное роли или группе, членом которой является участник.

  • Действующее разрешение, принадлежащее роли или группе, членом которой является участник.

Оценка разрешений всегда выполняется в контексте безопасности участника. Чтобы определить наличие действующего разрешения у какого-либо другого пользователя, вызывающая сторона должна обладать разрешением IMPERSONATE для данного пользователя.

Для объектов на уровне схем допустимы одно-, двух- и трехкомпонентные непустые имена. Для объектов на уровне базы данных допустимы одночастные имена, причем значение NULL означает текущую базу данных. Для самого сервера значение NULL является обязательным и означает текущий сервер. Данная функция не может проверить разрешения связанного сервера или пользователя Windows, для которого не создан участник уровня сервера.

Приведенный ниже запрос возвращает список встроенных классов защищаемых объектов:

   SELECT class_desc FROM sys.fn_builtin_permissions(default);

Используются следующие параметры сортировки.

  • Параметры сортировки текущей базы данных. Защищаемые объекты на уровне базы данных, куда относятся защищаемые объекты, не входящие в схему; одно- или двухчастные защищаемые объекты схемы, а также целевая база данных (если используется трехкомпонентное имя).

  • master Параметры сортировки базы данных: Защищаемые объекты на уровне сервера.

  • ANY не поддерживается в проверке уровня столбца. Необходимо указать соответствующие разрешения.

Примеры

A.Наличие разрешения VIEW SERVER STATE на уровне сервера

Применимо для следующих объектов: С SQL Server 2008 по SQL Server 2014 включительно.

SELECT HAS_PERMS_BY_NAME(null, null, 'VIEW SERVER STATE');

Б.Наличие разрешения IMPERSONATE для олицетворения участника на уровне сервера Ps

Применимо для следующих объектов: С SQL Server 2008 по SQL Server 2014 включительно.

SELECT HAS_PERMS_BY_NAME('Ps', 'LOGIN', 'IMPERSONATE');

В.Наличие любых разрешений в текущей базе данных

SELECT HAS_PERMS_BY_NAME(db_name(), 'DATABASE', 'ANY');

Г.Наличие у участника базы данных Pd любых разрешений в текущей базе данных

Предположим, что участник обладает разрешением IMPERSONATE для участника Pd.

EXECUTE AS user = 'Pd'
GO
SELECT HAS_PERMS_BY_NAME(db_name(), 'DATABASE', 'ANY');
GO
REVERT;
GO

Д.Возможность создавать процедуры и таблицы в схеме S

Для выполнения следующего примера необходимо наличие разрешения ALTER в схеме S и разрешения 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

SELECT HAS_PERMS_BY_NAME
(QUOTENAME(SCHEMA_NAME(schema_id)) + '.' + QUOTENAME(name), 
    'OBJECT', 'SELECT') AS have_select, * FROM sys.tables

Ж.Наличие разрешения INSERT для таблицы SalesPerson в базе данных AdventureWorks2012

В следующем примере предполагается, что текущим контекстом базы данных является AdventureWorks2012, а также используется двухкомпонентное имя.

SELECT HAS_PERMS_BY_NAME('Sales.SalesPerson', 'OBJECT', 'INSERT');

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

SELECT HAS_PERMS_BY_NAME('AdventureWorks2012.Sales.SalesPerson', 
    'OBJECT', 'INSERT');

З.Столбцы таблицы T, для которых пользователь имеет разрешение SELECT

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)

Основные понятия

Разрешения (компонент Database Engine)

Защищаемые объекты

Иерархия разрешений (компонент Database Engine)