Sql server 通过在SQL Server中使用递归公共表表达式,分层确定用户是否处于角色(多对多)中?

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

考虑SQL数据库中的以下数据。通过查看角色中对象的第一行,您可以看到:

id为
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。

很好,正是我要找的!谢谢