Sql-Server

將 sys.dm_exec_input_buffer 與 @@SPID 一起使用時出現權限錯誤

  • August 14, 2021

當我在 SQL Server 2016 或 Azure SQL DB 上執行這個 SQL 塊時:

--hello world
SELECT      event_info
FROM        sys.dm_exec_requests req
CROSS APPLY sys.dm_exec_input_buffer(req.session_id, req.request_id)
WHERE       req.session_id = @@SPID

我收到此錯誤,然後是預期結果:

Msg 300, Level 14, State 1, Line 5
VIEW SERVER STATE permission was denied on object 'server', database 'master'.
Msg 297, Level 16, State 1, Line 5
The user does not have permission to perform this action.
--hello world
SELECT      event_info
FROM        sys.dm_exec_requests req
CROSS APPLY sys.dm_exec_input_buffer(req.session_id, req.request_id)
WHERE       req.session_id = @@SPID

sys.dm_exec_input_buffer狀態的文件(強調我的):

在 SQL Server 上,如果使用者有 VIEW SERVER STATE 權限,使用者將看到 SQL Server 實例上所有正在執行的會話;否則,使用者將只能看到目前會話。

因此,根據文件,我可以訪問這些數據。那麼,為什麼會引發錯誤呢?

現在記錄在案

sys.dm_exec_input_buffer 的權限文件

文本:

在 SQL Server 上,如果使用者有 VIEW SERVER STATE 權限,使用者將看到 SQL Server 實例上所有正在執行的會話;否則,使用者將只能看到目前會話。

ℹ 重要

在沒有 VIEW SERVER STATE 權限(例如在觸發器、儲存過程或函式中)的情況下,在 SQL Server Management Studio 之外針對 SQL Server 執行此 DMV 會在 master 數據庫上引發權限錯誤。

在 SQL 數據庫上,如果使用者是數據庫所有者,則使用者將看到 SQL 數據庫上所有正在執行的會話;否則,使用者將只能看到目前會話。

ℹ 重要

在沒有所有者權限的情況下(例如在觸發器、儲存過程或函式中)在 SQL Server Management Studio 之外針對 Azure SQL 數據庫執行此 DMV 會在主數據庫上引發權限錯誤。

這做同樣的事情。獲取結果但也是權限被拒絕錯誤

select event_info FROM sys.dm_exec_input_buffer(@@spid, NULL)

這似乎是一個錯誤,因為文件說您應該能夠查看目前 spid 的資訊。它不應該出錯。

我發現了困難的方法。將其放入 proc 以檢索 event_info。proc執行並完成。Web 客戶端應用程序收到錯誤消息。

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