Sql-Server

如何限制 SQL 儲存過程一次由一個人執行?

  • October 9, 2018

我有一個儲存過程,它基本上從一個表中選擇值並將它們插入到另一個表中,這是一種歸檔。我想避免多人同時這樣做。

在此過程執行時,我不希望其他人能夠啟動它,但是我不希望序列化,其他人在我完成後執行該過程。

我想要的是讓其他人在我執行該過程時嘗試啟動它以獲取錯誤。

我嘗試過使用 sp_getapplock,但是我無法完全阻止該人執行該過程。

我還嘗試使用 sys.dm_exec_requests 查找過程並阻止該過程,雖然這確實有效,但我認為這不是最佳選擇,因為在某些伺服器上我沒有執行 sys.dm_exec_sql_text(sql_handle) 的權限。

對我來說最好的方法是什麼?

要添加到@Tibor-Karaszi 的答案,設置鎖定超時實際上不會產生錯誤(我已經針對文件送出了 PR)。sp_getapplock 只返回 -1,因此您必須檢查返回值。所以像這樣:

create or alter procedure there_can_be_only_one 
as
begin
begin transaction

 declare @rv int
 exec @rv = sp_getapplock 'only_one','exclusive','Transaction',0
 if @rv < 0
  begin
     throw 50001, 'There is already an instance of this procedure running.', 10
  end

 --do stuff
 waitfor delay '00:00:20'


commit transaction
end

在 proc 的開頭使用 sp_getapplock,並將鎖定超時設置為非常低的值。這樣,當您被阻止時,您會收到錯誤消息。

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