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


HAS_PERMS_BY_NAME (Transact-SQL)

Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure

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

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

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

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

Примечание.

Во вложенных защищаемых объектах не могут использоваться скобки в форме '[вложенное имя]'. Используйте вместо этого форму 'вложенное имя'.

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

В База данных SQL Azure аргумент под-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 не поддерживается в проверке уровня столбца. Необходимо указать соответствующие разрешения.

Примеры

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

Область применения: SQL Server 2008 (10.0.x) и более поздних версий

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

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

Область применения: SQL Server 2008 (10.0.x) и более поздних версий

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

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

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

D. Наличие у участника базы данных 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;  

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

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

G. У меня есть разрешение INSERT на таблицу SalesPerson в AdventureWorks2022?

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

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

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

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

H. Столбцы таблицы 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)