Иерархически определить, находится ли пользователь в роли (многие ко многим), используя рекурсивное выражение общей таблицы в SQL Server? - PullRequest
2 голосов
/ 15 февраля 2011

Рассмотрим следующие данные в базе данных SQL. Посмотрев на первый ряд в Objects_In_Roles, вы увидите, что:

объект типа user с идентификатором 1 находится в role с ролью 4 (имя под номером: Level * 4).

* примечание: уровень - это просто имя, не обязательно иерархический уровень

Посмотрев на другие данные в Objects_In_Roles, вы увидите, что роль Level 4 связана с ролью Level 3. Роль Level 3 связана с ролью Level 2, и, наконец, роль Level 2 связана с ролью User.

Можно ли создать запрос (используя рекурсивный CTE ), который определяет, что Fred связан с ролью User?

Пользователи

| userid | username |
+========+==========+
|   1    |  Fred    |
+--------+----------+

Роли

| roleid | rolename |
+========+==========+
|   1    |  User    |
|   2    |  Level 2 |
|   3    |  Level 3 |
|   4    |  Level 4 |
+--------+----------+

Objects_In_Roles

| objectid | objecttype | roleid |
+==========+============+========+
|    1     |   user     |   4    |
|    4     |   role     |   3    |
|    3     |   role     |   2    |
|    2     |   role     |   1    |
+----------+------------+--------+

1 Ответ

2 голосов
/ 15 февраля 2011

Вы можете перечислить все роли, которые имеет любой объект, Иерархически. Попробуйте следующее:

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

В приведенном выше примере вы перечислите все roleId, которые иерархически связаны с пользователем Fred.

...