2017-04-03 14 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 

しかし、あなたがこのテーブルに参加したい場合は、

INSTEAD OF DELETE 

そして、これでを使用する必要がOFCあなたが使用する必要がない場合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 
関連する問題