トリガーは、単純な履歴を作成するための最も迅速で簡単な方法です。次の情報は、履歴処理にいくつかのビジネス ルールが含まれる可能性があり、追跡対象のテーブルにないログ情報が必要になる可能性がある、より複雑な例を想定しています。
トリガーはバイパスできないため、sproc よりも安全であると考えている人には、次の仮定をしていることを思い出してください。
!) ユーザーが DISABLE TRIGGER を実行できないようにする許可が存在します [ただし、エンタープライズ アプリケーションの一般的なパターンである sprocs での EXECUTE を除いて、データベースへのすべてのアクセスを制限する許可も存在する可能性があります] - したがって、正しい許可を想定する必要があり、したがって sprocs は等しいと想定する必要があります。セキュリティとバイパス機能に関するトリガー
!) データベースによっては、トリガーを起動しない更新ステートメントを実行できる場合があります。ネストされたトリガーの実行深度に関する知識を利用して、トリガーをバイパスできます。唯一の確実なソリューションには、データベースのセキュリティと、承認されたメカニズムのみを使用してデータへのアクセスを制限することが含まれます。これは、トリガー、sproc、またはデータ アクセス レイヤーのいずれであってもかまいません。
ここでの選択は明確だと思います。データが複数のアプリケーションによってアクセスされている場合、最下位の共通レイヤーから履歴を制御する必要があり、これはデータベースを意味します。
上記のロジックに従うと、トリガーまたはストアド プロシージャの選択は、ストアド プロシージャが最下位の共通層であるかどうかによって決まります。パフォーマンスと副作用をより適切に制御でき、コードの保守が容易になるため、トリガーよりも sproc を優先する必要があります。
トリガーは許容されますが、更新中のテーブル以外のデータを読み取ってロックを増加させないようにしてください。トリガーをログ テーブルへの挿入に制限し、必要なものだけをログに記録します。
アプリケーションが共通の論理アクセス レイヤーを使用しており、これが時間の経過とともに変化する可能性が低い場合は、ここでロジックを実装することをお勧めします。Chain Of Responsibility パターンとプラグイン アーキテクチャを使用し、これを Dependency Injection から駆動して、履歴モジュールであらゆる種類の処理を可能にします。これには、まったく異なる種類のテクノロジ、異なるデータベース、履歴サービス、またはその他のあらゆるものへのログ記録が含まれます。想像できました。