INSTEAD OF UPDATE トリガ

INSTEAD OF UPDATE トリガをビューまたはテーブルに定義すると、UPDATE ステートメントの標準動作を置き換えることができます。一般的に INSTEAD OF UPDATE トリガは、1 つ以上のベース テーブルのデータを変更する目的で、ビュー上に定義します。

UPDATE ステートメント内で参照するビューに INSTEAD OF UPDATE トリガが定義されている場合、SET 句内で参照している、このビューの NULL 値が許可されていない列には、すべて値を指定する必要があります。これには、ベース テーブルにある、入力値を指定できない次のような列をビュー列が参照している場合も含まれます。

  • ベース テーブルの計算列

  • IDENTITY INSERT が OFF に設定されているベース テーブルの ID 列

  • ベース テーブルの timestamp データ型の列

多くの場合、テーブルを参照する UPDATE ステートメントで計算列、ID 列、または timestamp 型の列に値を設定しようとすると、エラーが生成されます。これは、これらの列の値が SQL Server によって決定されるためです。列の NOT NULL 要件を満たすには、これらの列も UPDATE ステートメントに含める必要があります。ただし、UPDATE ステートメントが INSTEAD OF UPDATE トリガが定義されているビューを参照する場合、トリガに定義されているロジックでこれらの列をバイパスし、エラーを回避することができます。これを行うには、ベース テーブル内の対応する列について、INSTEAD OF UPDATE トリガで値の更新を試行しないようにする必要があります。これは、UPDATE ステートメントの SET 句にこれらの列を含めないことにより実現できます。inserted テーブルからレコードを処理する際に、計算列、ID 列、または timestamp 型の列に、列の NOT NULL 要件を満たすためのダミー値を格納することができます。INSTEAD OF UPDATE トリガではこれらの値が無視され、SQL Server により正しい値が設定されます。

この解決策が機能するのは、INSTEAD OF UPDATE トリガでは、inserted 列内の更新されないデータを処理する必要がないためです。INSTEAD OF UPDATE トリガに渡される inserted テーブルで、SET 句に指定された列は、INSTEAD OF INSERT トリガの inserted 列と同じルールに従っています。SET 句に指定されていない列の場合、inserted テーブルには UPDATE ステートメントが実行される前の値が格納されています。このトリガでは IF UPDATE(column) 句を使用して、特定の列が更新されたかどうかをテストできます。詳細については、「INSTEAD OF INSERT トリガー」を参照してください。

INSTEAD OF UPDATE トリガでは、計算列、ID 列、または timestamp 型の列に指定された値を WHERE 句の検索条件のみに使用します。

ビューの INSTEAD OF UPDATE トリガが、計算列、ID 列、timestamp 型の列、およびデフォルトの列に指定された更新済みの値を処理するために使用するロジックは、これらの型の列に挿入された値に適用するロジックと同じです。

注意

UPDATE 操作を使用して定義された外部キーを持つテーブルに対しては、INSTEAD OF UPDATE トリガを定義できません。

関連項目

概念