Permisos inclusivos e implícitos (Motor de base de datos)
En la jerarquía de permisos de SQL Server, la concesión de un permiso determinado puede transmitir los derechos de otros permisos por implicación. Se puede decir que los permisos de nivel superior incluyen los permisos de nivel inferior, más detallados, que los primeros implican.
dbo.ImplyingPermissions
La siguiente script de ejemplo utiliza como argumentos el nombre de una clase de elemento que puede protegerse y el nombre de un permiso. El ejemplo recorre la jerarquía de permisos, desde un nodo especificado hasta la raíz: CONTROL SERVER en el servidor. El ejemplo emite la lista de permisos que incluyen, por implicación, el permiso especificado.
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. Mostrar los permisos que implican el permiso ALTER en un esquema
SELECT * FROM dbo.ImplyingPermissions('schema', 'alter')
B. Mostrar los permisos que implican el permiso VIEW DEFINITION en un objeto
SELECT * FROM dbo.ImplyingPermissions('object', 'view definition')
C. Mostrar los permisos que implican el permiso TAKE OWNERSHIP en una ruta
SELECT * FROM dbo.ImplyingPermissions('route', 'take ownership')
D. Mostrar los permisos que implican el permiso EXECUTE en una colección de esquemas XML
SELECT * FROM dbo.ImplyingPermissions('xml schema collection', 'execute')
Vea también