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)
Другие ресурсы
Разрешения
Защищаемые объекты
Иерархия разрешений