sys.fn_my_permissions (Transact-SQL)

Возвращает список разрешений на защищаемый объект, фактически предоставленных участнику. Связанная функция — HAS_PERMS_BY_NAME.

Значок ссылки на разделСинтаксические обозначения в Transact-SQL

Синтаксис

fn_my_permissions (securable,'securable_class')

Аргументы

  • securable
    Имя защищаемого объекта. Если защищаемый объект — сервер или база данных, то это значение должно быть установлено в NULL. Аргумент securable — это скалярное выражение типа sysname. Аргумент securable может быть многочастным именем.

  • 'securable_class'
    Имя класса защищаемого объекта, для которого перечислены разрешения. Аргумент securable_class является типом sysname. Аргумент securable_class принимает одно из следующих значений: APPLICATION ROLE, ASSEMBLY, ASYMMETRIC KEY, CERTIFICATE, CONTRACT, DATABASE, FULLTEXT CATALOG, MESSAGE TYPE, OBJECT, REMOTE SERVICE BINDING, ROLE, ROUTE, SCHEMA, SERVICE, SYMMETRIC KEY, TYPE, USER, XML SCHEMA COLLECTION.

Возвращаемые столбцы

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

Имя столбца

Тип

Описание

entity_name

sysname

Имя защищаемого объекта, на который предоставлены перечисленные разрешения.

subentity_name

sysname

Имя столбца, если у защищаемого объекта есть столбцы, в противном случае — NULL.

permission_name

nvarchar

Имя разрешения.

Замечания

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

  • разрешение было предоставлено непосредственно участнику и не было запрещено;

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

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

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

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

Для сущностей уровня схемы допустимы одно-, двух- и трехчастные имена, значением которых не является NULL. Для сущностей уровня базы данных допустимо имя, состоящее из одной части, значение NULL означает «текущая база данных». Для самого сервера необходимо значение NULL (означающее «текущий сервер»). Функция fn_my_permissions не может проверить разрешения на связанном сервере.

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

SELECT DISTINCT class_desc FROM fn_builtin_permissions(default)
    ORDER BY class_desc;
GO

Если значение DEFAULT передано как securable или securable_class, значение будет интерпретировано как NULL.

Примеры

А. Перечисление действующих разрешений на сервере

Следующий пример возвращает список действующих разрешений вызывающей стороны на сервере.

SELECT * FROM fn_my_permissions(NULL, 'SERVER');
GO

Б. Перечисление действующих разрешений в базе данных

Следующий пример возвращает список действующих разрешений для вызывающей стороны в базе данных База данных AdventureWorks2008R2.

USE AdventureWorks2008R2;
SELECT * FROM fn_my_permissions (NULL, 'DATABASE');
GO

В. Перечисление действующих разрешений в представлении

Следующий пример возвращает список действующих разрешений вызывающей стороны в представлении vIndividualCustomer в схеме Sales базы данных База данных AdventureWorks2008R2.

USE AdventureWorks2008R2;
SELECT * FROM fn_my_permissions('Sales.vIndividualCustomer', 'OBJECT') 
    ORDER BY subentity_name, permission_name ; 
GO 

Г. Перечисление действующих разрешений другого пользователя

Следующий пример возвращает список действующих разрешений пользователя базы данных Wanida для таблицы Employee в схеме HumanResources базы данных База данных AdventureWorks2008R2. Для вызывающей стороны требуется разрешение IMPERSONATE для пользователя Wanida.

EXECUTE AS USER = 'Wanida';
SELECT * FROM fn_my_permissions('HumanResources.Employee', 'OBJECT') 
    ORDER BY subentity_name, permission_name ;  
REVERT;
GO

Д. Перечисление действующих разрешений для сертификата

Следующий пример возвращает список действующих разрешений вызывающей стороны для сертификата с именем Shipping47 в текущей базе данных.

SELECT * FROM fn_my_permissions('Shipping47', 'CERTIFICATE');
GO

Е. Перечисляет действующие разрешения для коллекции XML-схем

Следующий пример возвращает список действующих разрешений вызывающей стороны на коллекцию XML-схем по имени ProductDescriptionSchemaCollection в базе данных База данных AdventureWorks2008R2.

USE AdventureWorks2008R2;
SELECT * FROM fn_my_permissions('ProductDescriptionSchemaCollection',
    'XML SCHEMA COLLECTION');
GO

Ж. Перечисление действующих разрешений для пользователя базы данных

Следующий пример возвращает список действующих разрешений вызывающей стороны для пользователя по имени MalikAr в текущей базе данных.

SELECT * FROM fn_my_permissions('MalikAr', 'USER');
GO

З. Перечисление действующих разрешений другого имени входа

Следующий пример возвращает список действующих разрешений SQL Server имени входа WanidaBenshoof для таблицы Employee в схеме HumanResources базы данных База данных AdventureWorks2008R2. Для вызывающей стороны требуется разрешение IMPERSONATE для имени входа SQL ServerWanidaBenshoof.

EXECUTE AS LOGIN = 'WanidaBenshoof';
SELECT * FROM fn_my_permissions('AdventureWorks2008R2.HumanResources.Employee', 'OBJECT') 
    ORDER BY subentity_name, permission_name ;  
REVERT;
GO