我正在使用 SQL Server 2008。我有一个表,其中详细说明了用户对具有两列的组的访问 -userid int
和groupid int
(我们称之为tbl_access
)。每个用户都可以访问树中任何级别的多个组。
还有第二个组表定义了一个包含三列的树结构 - groupid int
, groupfather int
, groupname nvarchar(32) (顶级组的值为 -1 groupfather
) - 我们称之为tbl_groups
。
我正在尝试编写一个给定 auserid
的函数,该函数将查找用户可以访问的所有组tbl_access
,然后对于每个组,它将找到所有子节点,并返回用户所有组的组合不同列表可以访问)。
我曾尝试使用 CTE,但这只能让我获得一个组的所有子节点,而不是所有组的所有子节点。
我现在拥有的是:
CREATEFUNCTION [DBO].[FUNC_ALL_CHILDGROUPS] (@GROUPID INT)
RETURNS TABLE
AS
RETURN (
WITH ALLGROUPS (GROUPID, GROUPFATHER) AS
(
SELECT GROUPID, GROUPFATHER
FROM
TBL_GROUPS
WHERE GROUPID = @GROUPID
UNION ALL
SELECT TBL_GROUPS.GROUPID, TBL_GROUPS.GROUPFATHER
FROM
TBL_GROUPS
INNER JOIN ALLGROUPS
ON TBL_GROUPS.GROUPFATHER = ALLGROUPS.GROUPID
)
SELECT * FROM ALLGROUPS