Autorisations couvrantes/implicites (moteur de base de données)
Au sein de la hiérarchie des autorisations SQL Server, l'attribution d'une autorisation particulière peut entraîner implicitement celle d'autres autorisations. Les autorisations de haut niveau peuvent être décrites comme couvrant les autorisations de bas niveau, de granularité plus élevée, qu'elles impliquent.
dbo.ImplyingPermissions
Cet exemple de script accepte comme arguments le nom de classe d'un sécurisable et le nom d'une autorisation. L'exemple parcourt la hiérarchie des autorisations, à partir d'un nœud spécifié jusqu'à la racine : CONTROL SERVER sur le serveur. Il émet la liste des autorisations qui incluent de manière implicite l'autorisation spécifiée.
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
A. Liste des autorisations qui impliquent l'autorisation ALTER sur un schéma
SELECT * FROM dbo.ImplyingPermissions('schema', 'alter')
B. Liste des autorisations qui impliquent l'autorisation VIEW DEFINITION sur un objet
SELECT * FROM dbo.ImplyingPermissions('object', 'view definition')
C. Liste des autorisations qui impliquent l'autorisation TAKE OWNERSHIP sur un itinéraire
SELECT * FROM dbo.ImplyingPermissions('route', 'take ownership')
D. Liste des autorisations qui impliquent l'autorisation EXECUTE sur une collection de schémas XML
SELECT * FROM dbo.ImplyingPermissions('xml schema collection', 'execute')