1

特定のレコードが削除されないようにしたい。このトリガーは、その特定のレコードに対して正常に機能します。ただし、他のレコードは削除されても残ります。なんで?

 ALTER TRIGGER [Globalization].[CountriesTracker] 
 ON [Globalization].[Countries] 
 INSTEAD OF DELETE
 AS 
 BEGIN
SET NOCOUNT ON;
IF ((Select COUNT(*) from [Deleted]
     Where [Deleted].[CountryId] = '36bd1536-fb56-4ec4-957e-1b3afde16c56') = 1)
BEGIN       
    RAISERROR('You can not delete this specific record!', 0, 0)
    ROLLBACK TRANSACTION
    RETURN
END
END

上記の条件に一致しない行が期待どおりに削除されていることを確認するにはどうすればよいですか?

4

2 に答える 2

4

INSTEAD OFトリガーがあるため、実際のDELETEが必要です。

また、保護された行を単純に除外することも検討します。理由は次のとおりです。

  • エラースローが必要ですか?または黙って無視しますか?
  • 保護された行を含む複数行の削除についてはどうですか?全体を中止するか、残りを削除しますか?

何かのようなもの:

ALTER TRIGGER [Globalization].[CountriesTracker]  ON [Globalization].[Countries] 
 INSTEAD OF DELETE
 AS 
SET NOCOUNT ON;

DELETE
   CT
FROM
   [Globalization].[Countries] C
   JOIN
   DELETED D ON C.CountryId = D.CountryId
WHERE
    [Deleted].[CountryId] <> '36bd1536-fb56-4ec4-957e-1b3afde16c56'
 GO
于 2010-10-27T20:14:47.143 に答える
3

これはINSTEADOFであるため、デフォルトの場合でも削除操作を実行する必要があります。

于 2010-10-27T20:12:49.827 に答える