2016-07-10 185 views
0

我需要創建一個SQL Server觸發器來阻止更新並將其刪除到表ServiceSQL Server觸發器中的IF語句

此操作僅適用於Service,其中列State的樣本數據爲「已完成」。

它應該允許更新和刪除到Service其中列State的樣本數據是「活動」。

這就是我嘗試過的,我在執行else操作時遇到問題(即允許更新Service,其中列State樣本數據爲「活動」)。

CREATE TRIGGER [Triggername] 
ON dbo.Service 
FOR INSERT, UPDATE, DELETE 
AS 
    DECLARE @para varchar(10), 
      @results varchar(50) 

    SELECT @para = Status 
    FROM Service 

    IF (@para = 'completed') 
    BEGIN 
     SET @results = 'An invoiced service cannot be updated or deleted!'; 
     SELECT @results; 
    END 

BEGIN 
    RAISERROR ('An invoiced service cannot be updated or deleted', 16, 1) 
    ROLLBACK TRANSACTION 

    RETURN 
END 
+0

如果你想阻止更新和刪除 - 那麼爲什麼INSERT'也觸發?另外:你從來沒有看過'Deleted'和'Inserted'僞表,它告訴你*哪些行已被更新(或刪除) - 所以這是行不通的...... –

+0

它返回價值'開具發票的服務不能更新或刪除!'。但我不確定它是否檢查條件是否爲 – Ayyub

回答

1

所以,如果我理解正確的話,任何UPDATEDELETE應該被允許,如果State柱具有Active值,但在其他情況下停止?

然後我會做到這一點:

CREATE TRIGGER [Triggername] 
ON dbo.Service 
FOR UPDATE, DELETE 
AS 
BEGIN 
    -- if any row exists in the "Deleted" pseudo table of rows that WERE 
    -- in fact updated or deleted, that has a state that is *not* "Active" 
    -- then abort the operation 
    IF EXISTS (SELECT * FROM Deleted WHERE State <> 'Active') 
     ROLLBACK TRANSACTION 

    -- otherwise let the operation finish 
END 

作爲一個說明:您無法很容易地從一個觸發器回消息(與SELECT @Results) - 觸發只是默默的通過回滾當前活動事務

失敗
+0

如果我必須返回一個輸出,指出「發票服務無法更新或刪除!」,我該怎麼辦?爲完成的服務。 – Ayyub

+0

當我執行此代碼時,它會返回錯誤,「END'附近的語法錯誤。」 – Ayyub

+0

@Ayyub:正如我試圖說的:你*不能*從觸發器中返回任何東西 - 沒有消息,沒有數字 - 觸發器只是在後臺默默地工作。如果你需要這樣的消息,你需要檢查*之前*刪除/更新,如果該操作將被允許(或不)。 –