Abdeckende/implizite Berechtigungen (Datenbankmodul)
In der Berechtigungshierarchie von SQL Server können durch das Erteilen einer bestimmten Berechtigung implizit die Rechte anderer Berechtigungen erteilt werden. Berechtigungen auf höherer Ebene können so beschrieben werden, dass sie die detaillierteren Berechtigungen auf niedrigerer Ebene abdecken, die durch sie impliziert werden.
dbo.ImplyingPermissions
Im folgenden Beispielskript werden als Argumente der Klassenname eines sicherungsfähigen Elements und der Name einer Berechtigung verwendet. Der Berechtigungshierarchie wird von einem angegebenen Knoten zum Stamm traversiert (CONTROL SERVER beim Server). Das Beispiel gibt die Liste der Berechtigungen aus, einschließlich der durch Implikation angegebenen Berechtigungen.
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. Listet Berechtigungen auf, die ALTER-Berechtigungen für ein Schema implizieren
SELECT * FROM dbo.ImplyingPermissions('schema', 'alter')
B. Listet Berechtigungen auf, die die VIEW DEFINITION-Berechtigung für ein Objekt implizieren
SELECT * FROM dbo.ImplyingPermissions('object', 'view definition')
C. Listet Berechtigungen auf, die die TAKE OWNERSHIP-Berechtigung für eine Route implizieren
SELECT * FROM dbo.ImplyingPermissions('route', 'take ownership')
D. Listet Berechtigungen auf, die die EXECUTE-Berechtigung für eine XML-Schemasammlung implizieren
SELECT * FROM dbo.ImplyingPermissions('xml schema collection', 'execute')