SQL视图仅授予SELECT权限时提示缺少函数执行权限问题咨询
权限差异原因分析
两类函数的权限要求差异核心是SQL Server所有权链是否完整:
当视图、函数、以及函数内部访问的所有表都属于同一个所有者(比如都是dbo所有)时,所有权链完整,用户只要有视图的SELECT权限,SQL Server会自动沿着所有权链继承权限,不需要单独授予函数的EXECUTE权限。
如果函数内部访问的某张表的所有者和视图/函数的所有者不一致,或者存在跨库对象、显式权限拒绝等情况,所有权链就会断裂,此时SQL Server会校验用户对函数本身的EXECUTE权限,就会出现需要单独授权才能访问的情况。
你提供的两个示例函数中,不需要授权的f_quantitatFabricadaLCV内部用到的所有表和函数/视图所有者一致,所有权链完整;需要授权的f_consum_color_exterior内部用到的至少一个表所有者不一致,导致链断裂,因此需要单独授权。
需要排查的配置项
- 所有相关对象的所有者:逐一检查视图、两类函数、函数内部用到的所有表的所有者,确认是否全部为dbo,可使用如下SQL查询对象所有者:
SELECT o.name AS ObjectName, USER_NAME(o.schema_id) AS SchemaName, USER_NAME(o.principal_id) AS ObjectOwner FROM sys.objects o WHERE o.name IN ('EXCEL_LLIBRETA_MAGICA_COMANDES_PENDENTS_V','f_quantitatFabricadaLCV','f_consum_color_exterior','OrdresFabricacioConsum','PartesProduccioComandes')
- 函数的执行上下文配置:检查需要单独授权的函数是否设置了非默认的
EXECUTE AS属性,默认值为EXECUTE AS CALLER,如果修改为其他值会破坏权限继承。 - 跨数据库对象配置:检查函数内部用到的表是否属于其他数据库,跨库所有权链默认关闭,会导致所有权链断裂。
- 显式拒绝权限配置:检查受限用户或其所属角色,是否被显式拒绝了对部分函数的EXECUTE权限,拒绝权限优先级高于继承权限。
最小权限最优解决方案
首选方案:修复所有权链
只要将所有相关对象的所有者统一为dbo,恢复完整所有权链,仅需要给用户授予视图的SELECT权限即可正常访问,完全符合权限最小化要求,操作示例:
-- 把所有权异常的对象所有者修改为dbo,替换为实际异常的对象名 ALTER AUTHORIZATION ON OBJECT::dbo.OrdresFabricacioConsum TO dbo; ALTER AUTHORIZATION ON OBJECT::dbo.tipusBobines TO dbo; -- 仅需要给用户授予视图SELECT权限 GRANT SELECT ON dbo.EXCEL_LLIBRETA_MAGICA_COMANDES_PENDENTS_V TO 你的受限用户名;
备选方案:单独授予必要函数权限
如果因为遗留系统限制无法修改对象所有者,可创建专属访问角色,仅授予必要的权限,避免授予整个schema的EXECUTE权限:
-- 创建视图专属访问角色 CREATE ROLE r_LLIBRETA_MAGICA_V_Access; -- 授予视图SELECT权限 GRANT SELECT ON dbo.EXCEL_LLIBRETA_MAGICA_COMANDES_PENDENTS_V TO r_LLIBRETA_MAGICA_V_Access; -- 仅给需要的函数授予EXECUTE权限,可根据实际报错的函数补充 GRANT EXECUTE ON dbo.f_consum_color_Exterior TO r_LLIBRETA_MAGICA_V_Access; GRANT EXECUTE ON dbo.f_consum_Gruix_Exterior TO r_LLIBRETA_MAGICA_V_Access; GRANT EXECUTE ON dbo.f_consum_color_Interior TO r_LLIBRETA_MAGICA_V_Access; GRANT EXECUTE ON dbo.f_consum_Gruix_Interior TO r_LLIBRETA_MAGICA_V_Access; -- 将受限用户加入角色 ALTER ROLE r_LLIBRETA_MAGICA_V_Access ADD MEMBER 你的受限用户名;
内容的提问来源于stack exchange,提问作者Marc Guillot
相关产品推荐
相关产品推荐

