2013-06-04 44 views
1

我正在使用具有觸發器的數據庫,以防止通過引發錯誤和不提交刪除來刪除特定表中的記錄。如果要刪除的記錄列有特定的值,我需要修改行爲以允許刪除。更改刪除觸發器以檢查列值

下面是當前的代碼:

CREATE TRIGGER [dbo].[MyTable_PreventDelete] 
ON [dbo].[MyTable] 
INSTEAD OF DELETE 
AS 
    -- TODO: Only run the code below if Deleted = 0 
    ROLLBACK 
    RAISERROR('ERROR: That column may not be deleted.',16,1) 
    RETURN 
GO 

我想簡單地包裹錯誤呼叫條件,但現在看來,我不能簡單地直接引用受影響行的列:

... 
CREATE TRIGGER [dbo].[MyTable_PreventDelete] 
ON [dbo].[MyTable] 
INSTEAD OF DELETE 
AS 
IF IsDeleted = 0 
BEGIN 
    ROLLBACK 
    RAISERROR('ERROR: That column may not be deleted.',16,1) 
    RETURN 
END 
GO 
+1

您正在使用sql server或其他數據庫嗎? –

+1

如果批處理中的記錄是可刪除的而有些不可刪除,那麼您需要什麼行爲?在SQL Server中,觸發器對批量數據而不是單行進行操作。 – HLGEM

+0

SQL Server 2005.如果批處理中的任何記錄的Deleted = 0,則整個事務將失敗 – watkinsmatthewp

回答

1

經過更多的調查,這是做了什麼。在這些操作的每個觸發器中引用了3個臨時表(INSERTED,UPDATED,DELETED)。在這種情況下,我們將檢查DELETED中影響的記錄(反映批次中影響的記錄)。如果有任何沒有設置標誌,則會出現錯誤:

IF EXISTS(SELECT 1 FROM DELETED d WHERE d.Deleted=0) 
BEGIN 
    ROLLBACK 
     -- the rollback is unnecessary 
     RAISERROR('ERROR: That column may not be deleted.',16,1) 
    END 
    ELSE 
     BEGIN 
     DELETE c 
     FROM [dbo].[MyTable] c 
     INNER JOIN DELETED d 
    ON c.PrimaryKey = d.PrimaryKey 
    END