Has_Perms_By_Name (Transact-SQL)

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

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

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

int

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

Замечания

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

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

Оценка разрешений всегда выполняется в контексте безопасности участника. Чтобы определить наличие действующего разрешения у какого-либо другого пользователя, вызывающая сторона должна обладать разрешением 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(SCHEMA_NAME(schema_id) + '.' + 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');

См. также

Справочник

sys.fn_builtin_permissions (Transact-SQL)
Представления каталога безопасности (Transact-SQL)

Другие ресурсы

Разрешения
Защищаемые объекты
Иерархия разрешений

Справка и поддержка

Получение помощи по SQL Server 2005