Sql server 通过在SQL Server中使用递归公共表表达式,分层确定用户是否处于角色(多对多)中?
考虑SQL数据库中的以下数据。通过查看角色中对象的第一行,您可以看到: id为Sql server 通过在SQL Server中使用递归公共表表达式,分层确定用户是否处于角色(多对多)中?,sql-server,recursion,common-table-expression,Sql Server,Recursion,Common Table Expression,考虑SQL数据库中的以下数据。通过查看角色中对象的第一行,您可以看到: id为1的user类型的对象处于角色id为4的角色中(角色名称:级别*4) *注意:级别只是一个名称,不一定是层次级别 通过查看角色中的对象中的其他数据,您可以看到级别4角色与级别3角色相关。3级角色与2级角色相关,最后2级角色与用户角色相关 是否可以创建一个查询(使用)来确定Fred与用户角色相关? 用户 | userid | username | +========+==========+ | 1 | Fre
1
的user
类型的对象处于角色id为4
的角色中(角色名称:级别*4)
*注意:级别只是一个名称,不一定是层次级别
通过查看角色中的对象中的其他数据,您可以看到级别4
角色与级别3
角色相关。3级
角色与2级
角色相关,最后2级
角色与用户
角色相关
是否可以创建一个查询(使用)来确定Fred
与用户
角色相关?
用户
| userid | username |
+========+==========+
| 1 | Fred |
+--------+----------+
| roleid | rolename |
+========+==========+
| 1 | User |
| 2 | Level 2 |
| 3 | Level 3 |
| 4 | Level 4 |
+--------+----------+
| objectid | objecttype | roleid |
+==========+============+========+
| 1 | user | 4 |
| 4 | role | 3 |
| 3 | role | 2 |
| 2 | role | 1 |
+----------+------------+--------+
角色
| userid | username |
+========+==========+
| 1 | Fred |
+--------+----------+
| roleid | rolename |
+========+==========+
| 1 | User |
| 2 | Level 2 |
| 3 | Level 3 |
| 4 | Level 4 |
+--------+----------+
| objectid | objecttype | roleid |
+==========+============+========+
| 1 | user | 4 |
| 4 | role | 3 |
| 3 | role | 2 |
| 2 | role | 1 |
+----------+------------+--------+
角色中的对象
| userid | username |
+========+==========+
| 1 | Fred |
+--------+----------+
| roleid | rolename |
+========+==========+
| 1 | User |
| 2 | Level 2 |
| 3 | Level 3 |
| 4 | Level 4 |
+--------+----------+
| objectid | objecttype | roleid |
+==========+============+========+
| 1 | user | 4 |
| 4 | role | 3 |
| 3 | role | 2 |
| 2 | role | 1 |
+----------+------------+--------+
您可以按层次结构列出任何对象具有的所有角色。请尝试以下操作:
DECLARE @ObjectId INT, @ObjectType VARCHAR(10)
SET @ObjectId = 1
SET @ObjectType = 'User';
WITH Tree AS
(
SELECT A.*
FROM Objects_In_Roles A
WHERE A.ObjectId = @ObjectId AND A.ObjectType = @ObjectType
UNION ALL
SELECT B.*
FROM Tree A
JOIN Objects_In_Roles B
ON A.RoleId = B.ObjectId AND B.ObjectType = 'role'
)
SELECT *
FROM Tree
在上面的示例中,您将列出所有按层次结构链接到用户Fred的roleId。很好,正是我要找的!谢谢