トリガと制約の比較
制約と DML トリガには異なる利点があり、それぞれに適した状況で効果を発揮します。DML トリガの第一の利点は、Transact-SQL コードを使用した複雑な処理ロジックを使用できることです。そのため、DML トリガでは、制約のすべての機能をサポートできます。ただし、機能によっては DML トリガを使用することが最適な方法ではない場合もあります。
PRIMARY KEY 制約と UNIQUE 制約の一部であるインデックス、またはこれらの制約とは無関係に作成されたインデックスの最下位レベルで、エンティティの整合性を常に確保する必要があります。ドメインの整合性の確保には CHECK 制約を使用し、参照整合性 (RI) の確保には FOREIGN KEY 制約を使用する必要があります。ただし、これらの機能がアプリケーションの機能要件を満たすことが前提となります。
DML トリガは、制約でサポートされている機能がアプリケーションの機能要件を満たすことができない場合に最も役立ちます。次に例を示します。
REFERENCES 句によって連鎖参照動作が定義されていない場合、FOREIGN KEY 制約で検証できるのは、ある列の値が別の列の値と完全に一致しているかどうかだけです。
制約でエラーを通知するには、標準化されたシステム エラー メッセージを使用する必要があります。カスタマイズしたメッセージや複雑なエラー処理が必要な場合、またはこれらを使用する利点がある場合は、アプリケーションでは、トリガを使用する必要があります。
DML トリガでは、データベースの関連テーブルを使用して変更を連鎖することができます。ただし、連鎖参照整合性制約を使用すると、これらの変更をより効率的に実行できます。
DML トリガでは参照整合性に反する変更を禁止してロールバックすることができるので、実行されたデータ変更をキャンセルすることができます。このようなトリガは、外部キーを変更したときに、新しい値がその主キーに一致しない場合に実行されます。ただし、通常、この目的には FOREIGN KEY 制約を使用します。
トリガ テーブルに制約が存在する場合、これらの制約は、INSTEAD OF トリガが実行されてから、AFTER トリガが実行されるまでの間にチェックされます。制約違反の場合は、INSTEAD OF トリガ動作がロールバックされ、AFTER トリガは実行されません。