ログオン トリガ実行のガイドライン
ここでは、ログオン トリガの起動順序を指定したり、ログオン トリガ内でトランザクションを管理したりするためのガイドラインについて説明します。
最初と最後のトリガの指定
LOGON イベントでは、複数のトリガを定義できます。sp_settriggerorder システム ストアド プロシージャを使用すると、定義したトリガの 1 つを、イベントで起動される最初または最後のトリガとして指定できます。SQL Server では、残りのトリガの実行順序は保証されません。詳細については、「構造化ストレージの設計と実装 (データベース エンジン)」を参照してください。
トランザクションの管理
SQL Server によってログオン トリガが起動される前に、SQL Server では、任意のユーザー トランザクションに依存しない暗黙のトランザクションが作成されます。その結果、最初のログオン トリガが起動し始めると、トランザクション数は 1 になります。すべてのログオン トリガの実行が完了すると、トランザクションがコミットされます。SQL Server では、他の種類のトリガと同様に、トランザクション数が 0 の状態でログオン トリガの実行が完了すると、エラーが返されます。ROLLBACK TRANSACTION ステートメントは、入れ子になったトランザクション内で実行される場合でも、トランザクション数を 0 にリセットします。COMMIT TRANSACTION を実行すると、トランザクション数が 0 まで減少することがあります。そのため、ログオン トリガ内では COMMIT TRANSACTION ステートメントを実行しないことをお勧めします。
ログオン トリガ内で ROLLBACK TRANSACTION ステートメントを使用する場合は、次の点を考慮してください。
ROLLBACK TRANSACTION が実行されるまでに行われたデータ変更がすべてロールバックされます。これには、現在のトリガによる変更、および同じイベントで先に実行されたトリガによる変更が含まれます。特定のイベントに対する残りのトリガは実行されません。
現在のトリガは、ROLLBACK ステートメントの後にある残りのステートメントすべてを引き続き実行します。これらのステートメントのいずれかによってデータが変更されても、その変更はロールバックされません。
LOGON イベントでトリガを実行中に次のいずれかの状況が発生すると、ユーザー セッションは確立されません。
元の暗黙のトランザクションがロールバックされるか失敗した。
重大度が 20 を超えるエラーがトリガ内部で発生した。