在函数中使用链接服务器时选择权限被拒绝,除非内联关闭

cas*_*tic 6 sql-server permissions functions sql-server-2019

升级到 SQL Server 2019 后,我们在 beta 环境中遇到异常错误。从标量值函数中进行选择时会发生这种情况。在我们运行 SQL 2014 的生产环境中不会发生此错误。

声明是:

select function(1234567)
Run Code Online (Sandbox Code Playgroud)

错误信息是:

消息 229,级别 14,状态 5,第 1 行
对象“函数”、数据库“数据库”、架构“dbo”的 SELECT 权限被拒绝。

功能是:

CREATE FUNCTION [dbo].[function](@var1 INT)
RETURNS BIT
BEGIN
    DECLARE @var2 BIT, @var3 BIGINT, var4 INT
    SET @var2 = 0

    SELECT @var3= ISNULL(tbl2.field1,tbl3.field1) FROM tbl1 
    LEFT OUTER JOIN tbl2 WITH (NOLOCK) ON tbl2.field2 = tbl1.field2 
    LEFT OUTER JOIN tbl3 WITH (NOLOCK) ON tbl3.field2 = tbl1.field2
    WHERE tbl1.field2 = @var1

    SELECT @var4 = ISNULL(field4,1) FROM linked_server.database.dbo.tbl4 WHERE field5=Convert(VARCHAR(20),@var3)
    IF(@var4 <> 1)
    BEGIN
        SET @var1 = 1
    END

    RETURN @var1
END

GO
Run Code Online (Sandbox Code Playgroud)

成功的解决方法:

  • 个人用户可以执行函数内部的语句而不会出错
  • 修改函数以包含子句“with inline = off”
  • 将执行函数的用户添加到 sysadmin 服务器角色

我不确定我们是否发现了错误,或者这只是缺少权限的情况(或完全其他原因)。如果可能,我们希望避免更改代码;将用户权限提升到sysadmin是不可能的。

我们正在运行 CU2。我们尚未在 CU3 上进行测试。

Pau*_*ite 1

当定义引用远程表时,UDF 内联现在会被阻止。

Microsoft SQL Server 2019 CU6中添加了此限制。