Sql-Server

什麼可能導致 SQL Server 一開始拒絕執行 SP,但稍後允許它不更改權限?

  • November 11, 2020

一個使用者(Windows 登錄)剛剛抱怨他被拒絕執行一個程序。我去檢查並確認他有執行它的權限。我沒有改變任何東西(現在我是唯一一個擁有管理員權限的人,如果需要的話),經過兩次不成功的嘗試,他第三次嘗試執行 SP,它成功了。

我已將 XE 配置為擷取錯誤消息,它擷取了兩倍的錯誤程式碼 229

對象“storedProcedureName”、數據庫“databaseName”、模式“schemaName”的 EXECUTE 權限被拒絕。

是否存在預期這種行為的任何情況?


Microsoft SQL Server 2014 (SP3-CU-GDR) (KB4535288) - 12.0.6372.1 (X64)

如果同時將 Windows 使用者帳戶添加到 Active Directory (AD) 組,並且該 AD 組有權執行該過程,則可能會創建這種情況,其中使用者無需更改 SQL Server 即可訪問過程.

還要讓網路管理員檢查使用者是否註銷並再次登錄。僅在登錄時分配組成員身份,因此如果使用者被添加到組中並且沒有註銷,他的令牌中將不會擁有該組成員身份。- 斯波里

相關問答:如何在 SQL Server 2008 中分配整個 Active Directory 組安全訪問權限?

另一個可能的根本原因是對儲存過程定義如何終止的誤解。以此為例:

CREATE OR ALTER PROCEDURE dbo.MyTestProc
AS
BEGIN
   SELECT result = 1;
END
GRANT EXECUTE ON dbo.MyTestProc TO [SomeUser];

這裡的目的是定義過程,然後授予它權限。

但是,第一次執行該批處理時,權限dbo.MyTestProc不會更改。第一次執行儲存過程本身時*,*通過EXEC dbo.MyTestProc,將授予權限以允許[SomeUser]執行該過程。

創建該過程並授予其權限的更正批次將是:

CREATE OR ALTER PROCEDURE dbo.MyTestProc
AS
BEGIN
   SELECT result = 1;
END
GO
GRANT EXECUTE ON dbo.MyTestProc TO [SomeUser];

GO過程定義和語句之間的意思GRANT是當你執行那個批處理時,過程將被創建並且授權將立即生效。

如果 proc 定義不正確,如上所示,使用者可能無法執行它。如果您隨後以系統管理員身份執行 proc,則第一次執行它會授予他們訪問權限。

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