Superset执行SQL Server存储过程报错:仅允许SELECT语句
问题解决:Superset执行SQL Server存储过程提示仅允许SELECT语句
原因
这是Superset的默认安全限制:为避免执行非只读数据库操作(如修改、删除数据),Superset的SQL编辑器默认仅允许SELECT类语句,会拦截EXEC等命令——即使数据库用户拥有EXEC权限,也会被Superset层面拦截。
解决办法
方法一:修改Superset配置放开EXEC权限(全局生效)
适合需要频繁执行存储过程的场景:
- 找到Superset核心配置文件
superset_config.py(无则新建) - 添加或更新
ALLOWED_SQL_COMMANDS配置,将'EXEC'加入允许列表:
注:若已有该配置,直接追加ALLOWED_SQL_COMMANDS = {'SELECT', 'EXEC'}'EXEC'即可,不要覆盖原有命令。 - 重启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
相关产品推荐
相关产品推荐

