【发布时间】:2017-11-16 21:33:56
【问题描述】:
我在 SQL CLR 标量函数中使用上下文连接。该函数构建一个动态查询,然后执行它(从各个地方获取数据/逻辑以构建查询)。
我可以手动“构建”动态字符串并在标准 Management Studio 窗口中运行它,它运行良好。当通过 CLR 在上下文连接上执行相同的查询时,我遇到了错误。
我调试了这个东西,发现错误是由于查询中调用的 TSQL UDF 的权限问题造成的。产生的错误信息是:
对 be.udfDivide 的执行权限被拒绝
我知道我可以访问该 UDF,因为它在我手动运行查询时工作 - 尽管通过 SQLCLR 运行时它会失败,即使 SQLCLR 代码应该在我的上下文中执行。
查询有效:
select be.udfDivide(sum(Numerator), sum(Denominator))
from Table where <some stuff>
<some stuff> 是所有复杂逻辑所在的地方,但我向您保证,它只是一个 where 子句,当查询中没有引用 UDF 时,此 CLR 函数每天成功运行数百万次。
通过一些创造性的查询黑客,我已经能够确认上下文连接是在正确的用户(SYSTEM_USER 和 CURRENT_USER)下运行的,并且我知道该用户有权访问 UDF。所以听起来确实是所有权链的中断是造成这种情况的原因。只是不知道如何修复它。
我知道在这种特定情况下我可以删除 UDF,因为它是一个简单的除法(尽管 UDF 为我们处理除以零),但对于更复杂的 UDF,我们希望能够在查询。
下面提供be.udfDivide函数,供参考:
ALTER function [be].[udfDivide](@Numerator float, @Demoninator float,
@ValueIfDivideByZero float)
returns float
as
begin
declare @result float
if @Demoninator = 0
begin set @result = @ValueIfDivideByZero end
else
begin set @result = @Numerator / @Demoninator end
return @result
end
【问题讨论】:
标签: sql-server tsql sql-server-2012 user-defined-functions sqlclr