재귀 CTE 다중 수준 [중복]
Nov 14 2020
어떤 역할이 데이터베이스 내의 어떤 리소스에 대한 액세스 권한을 재귀 적으로 부여하는지 보여주는 표가 있습니다. 예를 들면 :

Default_Role은 App_Role에 대한 액세스 권한을 부여하고 App_Role은 Security_Role에 대한 액세스 권한을 부여하며 Security_Role은 세 개의 테이블 (고객, 판매, 사용자)에 대한 액세스 권한을 부여합니다. 따라서 Default_Role의 멤버는 이러한 모든 권한이 부여되지만 Default_Role에는 Sys_Role에 대한 액세스 권한이 부여되지 않으며 System 또는 Admin 테이블에 대한 액세스 권한도 부여되지 않습니다.
CREATE TABLE SQLTest(
DBName NVARCHAR(100) NULL
,Privilege NVARCHAR(100) NULL
,PrivilegeType NVARCHAR(100) NULL
,PrivilegeDetail NVARCHAR(100) NULL
,TableName NVARCHAR(100) NULL
)
INSERT INTO SQLTest
VALUES
('TSDB','Default_Role','Role','App_Role',NULL),
('TSDB','App_Role','Role','Security_Role',NULL),
('TSDB','Sys_Role','Role','Security_Role',NULL),
('TSDB','Security_Role','Table','Customers','Customers'),
('TSDB','Security_Role','Table','Sales','Sales'),
('TSDB','Security_Role','Table','Users','Users'),
('TSDB','Sys_Role','Table','System','System'),
('TSDB','Sys_Role','Table','Admin','Admin')
Default_Role에 부여되지 않은 추가 액세스를 표시하지 않고 Default_Role에 부여 된 모든 액세스 (역할 및 테이블)를 볼 수 있도록이를 평면화하는 가장 좋은 방법은 무엇입니까? 이렇게 :

이 예제를 작성하려고했지만 작동하지 않습니다.
http://www.sqlfiddle.com/#!18/f9a27/2
답변
4 nbk Nov 14 2020 at 06:53
CTE는 첫 번째 테스트 용이므로 이해하기 매우 어렵 기 때문에 마지막에 모든 레벨을 사용하여 접근 방식을 작성했습니다.
마지막에있는 옵션은 매우 필요하지만 어떤 일이 발생하는지 알아 내려고 할 때 특히 줄이기 위해 낮은 숫자로 추가합니다.
WITH MyTest as
(
SELECT P.DBName, P.Privilege,p.PrivilegeType,P.PrivilegeDetail,P.TableName , CAST(P.PrivilegeDetail AS VarChar(Max)) as Level
FROM SQLTest P
WHERE P.Privilege = 'Default_Role'
UNION ALL
SELECT P1.DBName, P1.Privilege,p1.PrivilegeType,P1.PrivilegeDetail,p1.TableName , CAST(P1.PrivilegeDetail AS VarChar(Max)) + ', ' + M.Level
FROM SQLTest P1
INNER JOIN MyTest M
ON M.PrivilegeDetail = P1.Privilege
)
SELECT * From MyTest
OPTION (MAXRECURSION 50);
결과
DBName Privilege PrivilegeType PrivilegeDetail TableName Level
TSDB Default_Role Role App_Role (null) App_Role
TSDB App_Role Role Security_Role (null) Security_Role, App_Role
TSDB Security_Role Table Customers Customers Customers, Security_Role, App_Role
TSDB Security_Role Table Sales Sales Sales, Security_Role, App_Role
TSDB Security_Role Table Users Users Users, Security_Role, App_Role