HAS_PERMS_BY_NAME (Transact-SQL)
Оценивает действующие разрешения текущего пользователя для защищаемого объекта. Связанная функция — fn_my_permissions.
Синтаксис
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');