명시적/암시적 사용 권한(데이터베이스 엔진)

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')