Autorizzazioni effettive e implicite (Motore di database)
Nella gerarchia delle autorizzazioni di SQL Server la concessione di un'autorizzazione specifica può comportare l'assegnazione implicita dei diritti di altre autorizzazioni. Si può affermare che le autorizzazioni di livello alto includono quelle di livello basso, che pertanto sono definite implicite.
dbo.ImplyingPermissions
Nello script di esempio seguente vengono utilizzati come argomenti il nome di una classe di entità a protezione diretta e il nome di un'autorizzazione. Nell'esempio viene attraversata la gerarchia di autorizzazioni, da un nodo specificato alla radice, ovvero CONTROL SERVER nel server. Viene inoltre generato l'elenco delle autorizzazioni che includono l'autorizzazione implicita specificata.
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. Generazione dell'elenco delle autorizzazioni che includono l'autorizzazione implicita ALTER per uno schema
SELECT * FROM dbo.ImplyingPermissions('schema', 'alter')
B. Generazione dell'elenco delle autorizzazioni che includono l'autorizzazione implicita VIEW DEFINITION per un oggetto
SELECT * FROM dbo.ImplyingPermissions('object', 'view definition')
C. Generazione dell'elenco delle autorizzazioni che includono l'autorizzazione implicita TAKE OWNERSHIP per una route
SELECT * FROM dbo.ImplyingPermissions('route', 'take ownership')
D. Generazione dell'elenco delle autorizzazioni che includono l'autorizzazione implicita EXECUTE per un insieme di schemi XML
SELECT * FROM dbo.ImplyingPermissions('xml schema collection', 'execute')
Vedere anche