Trigger

如何使用觸發器使 SQL Job 的 step 成功或失敗

  • April 26, 2016

Step 1. 呼叫腳本觸發申請流程。當應用程序啟動時,它將向特定表中插入一條記錄。一旦該過程結束,該記錄將從表中刪除。插入和刪除 SQL 是從應用程序發出的。

Step 2. 檢查Step 1的執行狀態。因為有程序執行時的記錄。目前,我使用兩個 SELECT 語句進行檢查。當第一個 SELECT 語句獲取記錄時,該過程開始。然後延遲大約 15 分鐘,執行另一個 SELECT 語句,當記錄被刪除時。我知道這個過程已經結束。流程完成後,我將觸發第 3 步以執行另一個流程。

步驟 2 的方法有缺點。因為第 1 步的過程時間會不時變化。所以我需要調整延遲時間。我認為在這種情況下觸發是一種更好的方法。但我不知道如何將觸發器與 SQL Job Step 的成功和失敗聯繫起來。你能舉個例子嗎?謝謝。

如果您將記錄儲存在永久表中,則可以使用下面的觸發器。

--to check status of inserted record  

create trigger triggername   
on tablename    
for insert     
as    
begin     
if exists(select 1 from inserted)    
--do your logic here    
end       

--to check status of deleted record    

create trigger triggername  
on tablename    
for delete
as    
begin   
if exists( select 1 from deleted)    
--do your logic here to start another process     
end    

僅供參考,inserteddeleted可用於了解作為觸發器操作的結果插入/刪除了哪些記錄,並且無論插入或刪除多少行,觸發器只會在每個語句中觸發一次。此外,您可以將上述兩個語句合併為一個,只需執行以下操作:

create trigger triggername    
on tablename    
for insert,delete    
as    
if exists(select 1 from inserted)    
begin   
--what you want to do when a record is inserted   
end      

if exists(select 1 from deleted)    
begin    
--what you want to do when a record is deleted    
end    

問題中的某些術語可能被濫用,但目前我會從表面上看問題。

該問題描述了以下場景:

  1. 啟動過程 A
  2. 等待程序 A 完成後再繼續
  3. 啟動過程 B

這是跨多個作業步驟的 SQL 代理作業的自然操作。為了實現上述行為,不需要做任何特別的事情:沒有狀態表,沒有在狀態表中插入或刪除“正在執行”的條目,沒有循環檢查表的狀態,也沒有可能替換的觸發器開始時不需要的循環。

並且每個 Job Step 的預設操作是在發生錯誤時取消整個 Job(意思是:不進行下一個 Job Step),儘管這是可配置的。

這並不意味著您不能有一個日誌表來跟踪 X 天內作業的開始和結束時間。您當然可以有一個額外的表,它要麼只是提供資訊,要麼可能用於確定該過程是否成功完成以及是否需要做更多的工作。例如,我創建了多步作業,將其進度跟踪到日誌或狀態表中。這允許我安排作業每 5 或 10 分鐘執行一次(或任何適合特定操作的時間),並且每個作業步驟將在開始時檢查目前狀態,如果目前步驟已經完成,則跳到下一個步驟。這樣,作業就不會不必要地重複成功完成的工作/處理。

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