2012-02-23 15 views
6

SQLデータベースエンジン内でトリガはどのように実装されていますか? SQL言語レベルのトリガ定義ではなく、Oracle、SQL Server、MySQLなどの基礎となる実装について言及しています。データベースエンジンは、数百または数千のトリガをスケーラブルに管理できますか。彼らはオブザーバー/リスナーパターンのようなパブリッシュ/サブスクライブモデルを使用していますか?被験者に関する関連する文献へのあらゆる指針も認められるであろう。SQLデータベースエンジン内でデータベーストリガはどのように実装されていますか?

私は "データベーストリガーの実装"のためにgoogleを行ったが、私が見つけたのは、SQLトリガーの定義に関する情報だった。

+0

これはおそらく[dba.se]にあるはずです。私は実際には分からないので、私はそれを見守っています。 – Ben

答えて

1

オープンソースデータベースのソースコードを調べることができます。 たとえば、PostreSql's trigger

3

トリガーはコールバックであるため、実装はCの関数ポインタと同じくらい単純になります。通常、ユーザはCのRDBMSにユーザ定義の手続き型コードを書くことは期待されません。他の "上位レベル"の言語をサポートする必要があります。したがって、関連するプログラミングパターンはDSLです。トリガーの数(スケーラビリティ)自体は問題ではありません。なぜなら、通常は1つのテーブルにつき最大2つしかなく、これらのトリガーイベントのみがトリガーされるからです。実装上の課題は、一貫性、同時性のセマンティクスの分野です。

+0

自分のシステムにトリガのような仕組みを実装しようとしています。はい、私は、 "ユーザがRDBMSにユーザ定義の手続き型コードを書くことは期待されていない"ことを認識しています。私はあなたの前提に「テーブルあたり1つ、最大2つしかありません」ということを制限しているわけではありません。私は何千ものトリガーがあるかもしれないハイエンドのケースを見ています。 – stackoverflowuser2010

+1

挿入イベント、更新イベント、削除イベントは非常に限られています。何も考えられません。いくつかの奇妙なボールのシナリオでは、トリガーは、手順の千を呼び出すことができます - しかし、ここで私はあなたの要件を理解していないファンタジー土地に完全にオフです。 –

1

まず、トリガーとは、データベース内で特定のイベント(INSERT/UPDATE/DELETEなど)が発生したときに実行されるコードのことです。トリガーは暗黙的にDMLステートメントの前または後に実行され、トリガーはストアード・プロシージャーのように明示的に実行できません。

トリガーには、STATEMENT LEVELトリガーとROW LEVELトリガーの2種類があります。

STATEMENT LEVELトリガーは、ステートメントが実行される前または後に発生します。

ROW LEVELトリガーは、操作の影響を受ける個々の行で操作が実行される前または後に発生します。

1. BEFORE INSERT STATEMENT 
2. BEFORE INSERT ROW 
3. AFTER INSERT STATEMENT 
4. AFTER INSERT ROW 
5. BEFORE UPDATE STATEMENT 
6. BEFORE UPDATE ROW 
7. AFTER UPDATE STATEMENT 
8. AFTER UPDATE ROW 
9. BEFORE DELETE STATEMENT 
10. BEFORE DELETE ROW 
11. AFTER DELETE STATEMENT 
12. AFTER DELETE ROW 

複数のトリガーが言及した実行の優先順位の順序でイベントのためにコード化することができます。

は、だから我々は、トリガの12種類があります。

データベースでDMLクエリ(INSERT/UPDATE/DELETE)を実行するたびに、そのクエリはトランザクション内で実行されます。クエリが実行されるとき、従って -

  1. のテーブルがロックされているステートメントの前に実行トリガーの
  2. DBMSチェックが
  3. 実行される実際のSQL文の行ごとに実行します。
  4. 各行のBEFOREトリガーが検索されます。見つかった場合、実行されます。
  5. エラーをチェックしてください。存在する場合は、ステートメントまたはそのトリガーによって加えられた変更をロールバックします。
  6. AFTER EACH ROWトリガが検出されて実行されます。
  7. AFTER STATEMENTトリガーが検出されて実行されます。

異なるDBMSは、トランザクションを別々に管理します。詳細については、そのドキュメントを参照してください。

DBMSの多くは、コンパイルされたストアドプロシージャとは異なり、トリガをテキスト形式でのみ保持します。

ストアドプロシージャはトリガよりもはるかに高速なため、トリガ本体内部からストアドプロシージャを呼び出すことをお勧めします。

関連する問題