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

Superset执行SQL Server存储过程报错:仅允许SELECT语句

问题解决:Superset执行SQL Server存储过程提示仅允许SELECT语句

原因

这是Superset的默认安全限制:为避免执行非只读数据库操作(如修改、删除数据),Superset的SQL编辑器默认仅允许SELECT类语句,会拦截EXEC等命令——即使数据库用户拥有EXEC权限,也会被Superset层面拦截。

解决办法

方法一:修改Superset配置放开EXEC权限(全局生效)

适合需要频繁执行存储过程的场景:

  1. 找到Superset核心配置文件superset_config.py(无则新建)
  2. 添加或更新ALLOWED_SQL_COMMANDS配置,将'EXEC'加入允许列表:
    ALLOWED_SQL_COMMANDS = {'SELECT', 'EXEC'}
    
    注:若已有该配置,直接追加'EXEC'即可,不要覆盖原有命令。
  3. 重启Superset服务,配置生效。

方法二:将存储过程调用包装在SELECT语句中(无需修改配置)

适合临时执行存储过程的场景,通过SQL语法转换结果为SELECT查询:

方式A:临时表方案(兼容性好)

先创建匹配存储过程返回结构的临时表,插入结果后再查询:

-- 替换为存储过程实际返回的列名和数据类型
CREATE TABLE #TempFuelBidVolume (
    BidDate DATE,
    Volume DECIMAL(18,2),
    FuelType VARCHAR(50)
)

-- 执行存储过程并插入临时表
INSERT INTO #TempFuelBidVolume
EXEC [CI_DW1].[Reports].[spGetPSBMFuelBidOfferVolume]
    @fromDate = '20220824',
    @toDate = '20220824'

-- 查询结果
SELECT * FROM #TempFuelBidVolume

-- 清理临时表
DROP TABLE #TempFuelBidVolume

方式B:OPENROWSET方案(需数据库配置支持)

若SQL Server开启了Ad Hoc Distributed Queries选项,可直接用OPENROWSET调用存储过程:

SELECT * 
FROM OPENROWSET(
    'ODBC Driver 18 for SQL Server',
    'Server=server:port;Database=CI_DW1;TrustServerCertificate=YES;encrypt=yes;UID=username;PWD=password;',
    'EXEC [Reports].[spGetPSBMFuelBidOfferVolume] @fromDate = ''20220824'', @toDate = ''20220824'''
)

注:需通过sp_configure启用SQL Server的Ad Hoc Distributed Queries配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 23:18:33