Покрывающие или неявные разрешения (компонент Database Engine)
В иерархии разрешений сервера SQL Server предоставление конкретного разрешения подразумевать неявное предоставление других разрешений. Разрешение более высокого уровня можно представить как разрешение, покрывющее разрешения более низкого уровня, которые предполагаются этим разрешением высокого уровня.
dbo.ImplyingPermissions
Данный образец сценария принимает в качестве аргументов имя класса защищаемого объекта и название разрешения. Образец проходит иерархию разрешений от заданного узла до корня CONTROL SERVER на сервере. Образец выдает список разрешений, который неявно содержит и указанное разрешение.
CREATE FUNCTION dbo.ImplyingPermissions (@class nvarchar(64),
@permname nvarchar(64))
RETURNS @ImplPerms table (permname nvarchar(64),
class nvarchar(64), height int, rank int)
AS
BEGIN
WITH
class_hierarchy(class_desc, parent_class_desc)
AS
(
SELECT DISTINCT class_desc, parent_class_desc
FROM sys.fn_builtin_permissions('')
),
PermT(class_desc, permission_name, covering_permission_name,
parent_covering_permission_name, parent_class_desc)
AS
(
SELECT class_desc, permission_name, covering_permission_name,
parent_covering_permission_name, parent_class_desc
FROM sys.fn_builtin_permissions('')
),
permission_covers(permission_name, class_desc, level,
inserted_as)
AS
(
SELECT permission_name, class_desc, 0, 0
FROM PermT
WHERE permission_name = @permname AND
class_desc = @class
UNION ALL
SELECT covering_permission_name, class_desc, 0, 1
FROM PermT
WHERE class_desc = @class AND
permission_name = @permname AND
len(covering_permission_name) > 0
UNION ALL
SELECT PermT.covering_permission_name,
PermT.class_desc, permission_covers.level,
permission_covers.inserted_as + 1
FROM PermT, permission_covers WHERE
permission_covers.permission_name =
PermT.permission_name AND
permission_covers.class_desc = PermT.class_desc
AND len(PermT.covering_permission_name) > 0
UNION ALL
SELECT PermT.parent_covering_permission_name,
PermT.parent_class_desc,
permission_covers.level + 1,
permission_covers.inserted_as + 1
FROM PermT, permission_covers, class_hierarchy
WHERE permission_covers.permission_name =
PermT.permission_name AND
permission_covers.class_desc = PermT.class_desc
AND permission_covers.class_desc = class_hierarchy.class_desc
AND class_hierarchy.parent_class_desc =
PermT.parent_class_desc AND
len(PermT.parent_covering_permission_name) > 0
)
INSERT @ImplPerms
SELECT DISTINCT permission_name, class_desc,
level, max(inserted_as) AS mia
FROM permission_covers
GROUP BY class_desc, permission_name, level
ORDER BY level, mia
RETURN
END
А. Список разрешений, которые подразумевают разрешение ALTER на схему
SELECT * FROM dbo.ImplyingPermissions('schema', 'alter')
Б. Список разрешений, которые подразумевают разрешение VIEW DEFINITION на объект
SELECT * FROM dbo.ImplyingPermissions('object', 'view definition')
В. Список разрешений, которые подразумевают разрешение TAKE OWNERSHIP на маршрут
SELECT * FROM dbo.ImplyingPermissions('route', 'take ownership')
Г. Список разрешений, которые подразумевают разрешение EXECUTE на коллекцию XML-схем
SELECT * FROM dbo.ImplyingPermissions('xml schema collection', 'execute')
См. также