2017-04-03 250 views
2

我需要阻止刪除職業爲'程序員'的用戶。 因此,數據庫表結構是:在使用transact-SQL刪除觸發器之前

TABLE Client 
Id | Name | SSN | Occupation | Birthdate | 

我到目前爲止創建觸發看起來是這樣的:

CREATE TRIGGER Check_User_Occupation 
ON dbo.Client 
FOR DELETE 
AS 
BEGIN 
    IF(SELECT c.Occupation 
    FROM deleted AS d 
    INNER JOIN Client as c ON d.Id = c.Id) = 'Programmer' 
    BEGIN 
     PRINT 'YES'; 
     ROLLBACK TRAN 
     RAISEERROR(SELECT 'Could not delete client because he is a programmer'); 
END 
END 
GO 

我想它可以比之前該行被刪除,但我不不知道解決這個問題的正確方法。

任何幫助表示讚賞!

+1

使用而不是刪除觸發器。 –

回答

1

正確的語法是在這裏:

(你不需要加入刪除表,表本身,在刪除的是整排的delete語句......)但是要注意一個事實,那你是不是能夠做到在這種情況下批量刪除。它只能用於行刪除。

CREATE TRIGGER Check_User_Occupation 
ON dbo.Client 
FOR DELETE 
AS 
BEGIN 
    IF(SELECT Occupation FROM deleted) = 'Programmer' 
    BEGIN 
     PRINT 'YES'; 

     ROLLBACK 

     RAISERROR ('Could not delete client because he is a programmer', -- Message text 
        16, -- Severity 
        1 -- State 
        ) 

    END 
END 
GO 

對於批處理命令,最好使用有如下語句:

IF(SELECT COUNT(*) FROM deleted WHERE Occupation = 'Programmer') > 0 

但OFC如果你想加入這個表,你需要使用

INSTEAD OF DELETE 

而在這你不需要使用ROLLBACK

Finnaly它應該看起來像:

CREATE TRIGGER Check_User_Occupation 
ON dbo.Client 
INSTEAD OF DELETE 
AS 
BEGIN 
    IF(SELECT Occupation FROM deleted) = 'Programmer' 
    BEGIN 
     PRINT 'YES';   

     RAISERROR ('Could not delete client because he is a programmer', -- Message text 
        16, -- Severity 
        1 -- State 
        ) 

    END 
END 
GO