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

SQL Server生产环境未知来源调用dbo.proc_1_$sp的溯源方案咨询

解决方案

方案1:使用无权限要求的内置函数拼接日志(最优推荐)

你完全不需要访问sys.sysprocesses系统视图,SQL Server提供了一批公共权限的内置函数,任何连接用户都可以直接调用,不会触发权限不足的问题:

dbo.proc_1_$sp
...
begin try
  BEGIN
      SELECT @errmsg = 'failed to execute proc2_$sp'
      -- 全部用内置函数获取,无任何权限要求
      SELECT @errmsg = @errmsg 
        + ' 调用时间:'+convert(nvarchar, GETDATE(), 9)
        + ' 主机名:'+ISNULL(LTRIM(RTRIM(HOST_NAME())),'未知') 
        + ' 程序名:'+ISNULL(LTRIM(RTRIM(PROGRAM_NAME())),'未知')
        + ' 登录名:'+ISNULL(SUSER_SNAME(),'未知')
        + ' 会话ID:'+CAST(@@SPID AS NVARCHAR(10))
    EXEC proc2_$sp; 
  END; 
...
catch
... etc

注:可以把这段拼接逻辑移到CATCH块中,只有报错时才执行,完全不影响正常执行的性能。

方案2:给存储过程加权限提升标识(如果需要查询更多系统视图信息)

如果你确实需要从系统视图中获取更多进程信息,可以在存储过程定义头部添加WITH EXECUTE AS OWNER选项,存储过程运行时会使用所有者(通常为dbo,拥有系统视图访问权限)的权限执行,不会受调用方权限限制,也不会导致程序崩溃:

CREATE OR ALTER PROC dbo.proc_1_$sp
WITH EXECUTE AS OWNER -- 新增这一行即可
AS
BEGIN
-- 原有存储过程逻辑
...
END

方案3:使用轻量的扩展事件会话捕获调用信息(无需修改存储过程)

如果不想修改生产环境的存储过程代码,可以创建一个仅捕获目标存储过程调用的扩展事件会话,性能损耗远低于SQL Server Profiler,生产环境连续运行数天也不会有明显影响:

  • 仅需要捕获rpc_completed或sql_batch_completed事件
  • 添加过滤条件:object_name = N'proc_1_$sp'
  • 捕获的字段默认就包含客户端主机名、登录名、程序名、调用时间等所有需要的信息

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 09:54:03