You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server 2017文档权限存储过程:实现用户仅见可访问的最新版本

存储过程实现方案

核心思路

先为每个用户确定其在指定文档下拥有权限的最高版本号,随后仅保留该用户与最高版本号对应的权限记录,最后按版本号分组并拼接用户ID列表。这种方式能直接确保每个版本只显示那些未在更高版本中拥有权限的用户。

存储过程代码

CREATE PROCEDURE GetLatestAccessibleRevisions
    @DocId INT -- 指定要查询的文档ID
AS
BEGIN
    SET NOCOUNT ON;

    -- 第一步:计算每个用户在目标文档下的最高权限版本号
    WITH UserMaxRevision AS (
        SELECT 
            UserId,
            MAX(RevisionId) AS MaxRevisionId
        FROM DOCUMENT_ACL
        WHERE DocId = @DocId
        GROUP BY UserId
    )
    -- 第二步:筛选出用户权限记录中版本号等于其最高版本的条目,再分组拼接用户ID
    SELECT 
        a.RevisionId,
        STRING_AGG(a.UserId, ',') AS UserIds
    FROM DOCUMENT_ACL a
    INNER JOIN UserMaxRevision umr 
        ON a.UserId = umr.UserId 
        AND a.RevisionId = umr.MaxRevisionId
    WHERE a.DocId = @DocId
    GROUP BY a.RevisionId
    ORDER BY a.RevisionId;
END

代码说明

  1. CTE UserMaxRevision:通过分组聚合,为每个用户计算出他们在指定文档下能访问的最高版本号,这一步直接排除了用户在低版本的冗余权限记录——我们只需要关心用户可访问的最新版本。
  2. 关联筛选:将原权限表与CTE结果关联,仅保留用户权限记录中版本号等于其最高版本的行,自动过滤掉那些在更高版本已有权限的用户在低版本的条目。
  3. 分组拼接:利用SQL Server 2017原生支持的STRING_AGG函数,按版本号分组并将用户ID拼接为逗号分隔的字符串,完全匹配需求的输出格式。

测试验证

针对你提供的DOCUMENT_ACL表数据(DocId=11),执行以下命令:

EXEC GetLatestAccessibleRevisions @DocId = 11;

将返回预期结果:

RevisionIdUserIds
1011001,1002
1021003
1031004,1005

内容的提问来源于stack exchange,提问作者user989010

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 22:35:19