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

能否限制Report Manager上的SSRS报表同一时间仅单用户访问?

解决SSRS报表并发访问冲突的本地部署方案

方案1:SSRS报表级自定义代码互斥锁(单服务器环境)

在报表的自定义代码中添加静态锁对象,强制同一时间仅允许一个实例执行:

Private Shared lockObj As New Object()

Public Function AcquireLock() As Boolean
    Try
        Monitor.Enter(lockObj)
        Return True
    Catch ex As Exception
        Return False
    End Try
End Function

Public Function ReleaseLock() As Boolean
    Try
        Monitor.Exit(lockObj)
        Return True
    Catch ex As Exception
        Return False
    End Try
End Function

然后在报表中配置锁逻辑:

  • 在数据集的执行前置逻辑中调用Code.AcquireLock(),若返回False则给用户显示“报表正在执行,请稍后重试”的提示;
  • 报表执行完成后(比如在页脚表达式中)调用Code.ReleaseLock()释放锁。

注意:该方案仅适用于单报表服务器部署,多服务器农场环境可能失效。

方案2:Report Manager站点级并发限制(影响所有报表)

若可接受全局执行限制,修改Report Manager系统设置:

  1. 登录Report Manager,进入站点设置 -> 系统属性 -> 执行;
  2. 将最大并发报表执行数设为1;
  3. 同时设置合理的报表执行超时(比如300秒),避免锁占用过久。

方案3:SharePoint文档库签出机制(内网集成场景)

如果报表通过SharePoint链接访问,利用SharePoint的签出功能限制并发:

  • 将报表访问链接存入SharePoint文档库的单个文档中;
  • 开启文档库的必需签出设置(路径:设置 -> 版本设置 -> 要求签出);
  • 用户需先签出该文档才能查看报表链接,同一时间仅允许一名用户签出,从而强制串行访问。

方案4:存储过程极小修改实现锁(可选)

若允许对存储过程做微小调整,添加全局临时表锁逻辑:

-- 存储过程开头加锁判断
DECLARE @LockExists INT
IF EXISTS(SELECT * FROM tempdb..##ReportExecutionLock)
BEGIN
    RAISERROR('报表正在执行,请稍后重试', 16, 1)
    RETURN
END
CREATE TABLE ##ReportExecutionLock (LockID INT)
INSERT INTO ##ReportExecutionLock VALUES(1)

-- 原有存储过程逻辑(执行xp_cmdshell导出Excel)
-- ...

-- 存储过程结尾释放锁
DROP TABLE ##ReportExecutionLock

该方案通过全局临时表实现跨会话互斥,避免并发写入同一Excel文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 14:45:24