명시적/암시적 사용 권한(데이터베이스 엔진)
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
1. 스키마에 대한 ALTER 권한이 내재된 사용 권한 나열
SELECT * FROM dbo.ImplyingPermissions('schema', 'alter')
2. 개체에 대한 VIEW DEFINITION 권한이 내재된 사용 권한 나열
SELECT * FROM dbo.ImplyingPermissions('object', 'view definition')
3. 경로에 대한 TAKE OWNERSHIP 권한이 내재된 사용 권한 나열
SELECT * FROM dbo.ImplyingPermissions('route', 'take ownership')
4. XML 스키마 컬렉션에 대한 EXECUTE 권한이 내재된 사용 권한 나열
SELECT * FROM dbo.ImplyingPermissions('xml schema collection', 'execute')