Sql-Server

在函式中使用連結伺服器時選擇權限被拒絕,除非內聯關閉

  • February 28, 2021

升級到 SQL Server 2019 後,我們在 beta 環境中遇到異常錯誤。從標量值函式中選擇時會發生這種情況。在我們執行 SQL 2014 的生產環境中不會出現此錯誤。

聲明是:

select function(1234567)

錯誤資訊是:

消息 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

成功的解決方法:

  • 個人使用者可以在函式內部執行語句而不會出錯
  • 修改函式以包含子句“with inline = off”
  • 將執行函式的使用者添加到 sysadmin 伺服器角色

我不確定我們是否發現了錯誤,或者這只是缺少權限的情況(或完全是其他原因)。如果可能,我們希望避免更改程式碼;將使用者權限提升到sysadmin是不可能的。

我們正在執行 CU2。我們尚未在 CU3 上進行測試。

當定義引用遠端表時,UDF 內聯現在被阻止。

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

如果優化器正在嘗試內聯,但由於使用遠端表(即連結伺服器)而失敗,則可以使用 WITH INLINE = OFF 使該函式避免內聯。您可以通過查詢[is_inlineable].[sys].[sql_modules]

https://sqlperformance.com/2019/01/sql-performance/scalar-udf-sql-server-2019

引用自:https://dba.stackexchange.com/questions/261917