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


HAS_PERMS_BY_NAME (Transact-SQL)

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

Значок ссылки на разделСоглашения о синтаксическом обозначении в 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, отличное от NULL, представляющее проверяемые разрешения. Значение по умолчанию отсутствует. Имя разрешения ANY является шаблоном для подстановки.

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

    ПримечаниеПримечание

    В версиях от SQL Server до SQL Server 2008 с пакетом обновления 2 (SP2) для защищаемых вложенных объектов не могут использоваться квадратные скобки в форме '[имя вложенного объекта]'. Вместо этого следует использовать форму 'имя вложенного объекта'.

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

Возвращаемые типы

int

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

Замечания

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

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

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

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

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

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

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

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

   SELECT class_desc FROM sys.fn_builtin_permissions(default)

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

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

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

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

Примеры

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

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

Б. Возможность олицетворения участника [системы безопасности] на уровне сервера Ps

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 в базе данных AdventureWorks

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

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

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

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

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

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');