2012-03-20 36 views
2

我有一張表格,它計算上個月的總扣除額和剩餘扣除額。更新觸發器中的同一張表

並且任何更新剩餘的扣除舊月應該會影響下個月的順序,所以我創建了一個AFTER UPDATE觸發器,但我注意到觸發器沒有被UPDATE調用下個月。

檢查觸發代碼

CREATE TRIGGER [dbo].[tgUpdateRemainingBalance] 
ON [dbo].[GAT_MONTHLY_DEDUCTION] 
AFTER UPDATE 
AS 
BEGIN 
SET NOCOUNT ON; 

DECLARE @OldTotalDeduction INT 
DECLARE @NewTotalDeduction INT 
DECLARE @OldRemainingToNextMonth INT 
DECLARE @NewRemainingToNextMonth INT 

SELECT @OldRemainingToNextMonth = RemainingToNextMonth, 
@OldTotalDeduction = TotalDeduction 
FROM DELETED 

SELECT @NewRemainingToNextMonth = RemainingToNextMonth, 
@NewTotalDeduction = TotalDeduction 
FROM INSERTED 

DECLARE @EmpNo BIGINT 
DECLARE @RegDate DATETIME 

SELECT @EmpNo = PersonnelNo, @RegDate = RegDate FROM INSERTED 

IF (@OldRemainingToNextMonth <> @NewRemainingToNextMonth) OR (@OldTotalDeduction <> @NewTotalDeduction) 
BEGIN 
UPDATE GAT_MONTHLY_DEDUCTION 
SET TotalDeduction = TotalDeduction - @OldRemainingToNextMonth + @NewRemainingToNextMonth, 
Visited = 1 
WHERE RegDate = DATEADD(month, 1, @RegDate) AND PersonnelNo = @EmpNo 
END 
END 

我做更新爲具有此觸發,但要求在第一時間應再次調用觸發下一次更新的觸發器在同一個表,但情況並非如此。

知道如何解決它是迫在眉睫的。

感謝

+0

歡迎StackOverflow上:如果您發佈的代碼,XML或數據樣本,請**在文本編輯器中高亮顯示這些行,然後單擊編輯器工具欄上的「代碼示例」按鈕(「{}」),以精確地格式化和語法突出顯示它! – 2012-03-20 09:39:44

+0

你可以給我們一個更好的想法,你想要完成什麼?看起來您希望在已更改的月份之後的所有月份更新TotalDeduction,但觸發器無法在觸發器內觸發。我問,因爲現在編寫的方式只會在下個月更新,即使觸發器被後續更新調用:唯一更改的字段是TotalDeduction和Visited,並且由於RemainingToNextMonth沒有更改,所以後續更新中不會有更改爲訪問國旗。 – Peter 2012-03-20 10:30:00

回答

8

有一點需要注意:在SQL Server觸發器被觸發一旦每條語句(和每行曾經爲許多開發商認爲/假設)

如果該聲明的更新多行,那麼InsertedDeleted僞表將包含多行 - 讓你選擇喜歡

SELECT 
    @NewRemainingToNextMonth = RemainingToNextMonth, 
    @NewTotalDeduction = TotalDeduction 
FROM INSERTED 

將失敗 - 應選擇哪一行,如果其中有五十個在Inserted

你需要重寫你的觸發器能夠處理多行同時被處理,在InsertedDeleted僞表...

相關問題