既にお知らせしたように、トリガーによって発行されたステートメントのみをロールバックするように ROLLBACK コマンドを変更/調整することはできません。
トリガーによってのみ実行されるアクションを「ロールバック」する方法が必要な場合は、回避策として、アクションを実行する前にトリガーがそれらのアクションによって例外的な状況が発生しないことを確認するようにトリガーを変更することを検討できます。トランザクション全体がロールバックします。
たとえば、トリガーが行を挿入する場合、次のようなチェックを追加して、新しい行が一意の制約 (または外部キー制約) に違反していないことを確認します。
IF NOT EXISTS (
SELECT *
FROM TableA
WHERE … /* a condition to test if a row or rows you are about
to insert aren't going to violate any constraint */
)
BEGIN
INSERT INTO TableA …
END;
または、トリガーが行を削除する場合は、他のテーブルによって参照されている行を削除しようとしていないかどうかを確認します (その場合、通常、どのテーブルが行を参照している可能性があるかを事前に知る必要があります)。
IF NOT EXISTS (
SELECT * FROM TableB WHERE …
)
AND NOT EXISTS (
SELECT * FROM TableC WHERE …
)
AND …
BEGIN
DELETE FROM TableA WHERE …
END
同様に、更新ステートメントがある場合は、そのチェックを行う必要があります。