2008.08.30 Saturday
徹底比較!! PostgreSQL vs MySQLパート2 with 勝手に vs Firebird (13)
徹底比較!! PostgreSQL vs MySQLパート2 with 勝手に vs Firebird (13)
徹底比較!! PostgreSQL vs MySQLパート2 第7回:トリガ(1/4)
ここでの比較表のフォーマットでFirebirdについて書くと以下のようになります。
--------------------------------------------------------------------
仕様項目 Firebird
開発言語 PSQL
対応SQL文の種類 INSERT、UPDATE、DELETE、同時に複数指定可能。それぞれ複数指定可能*1
行単位/文単位 行単位のみ
BEFORE/AFTER 共に使用可能
NEW・OLD演算子 使用可能
カスケードの制限 制限設定不可*2
処理と定義の分離 工夫することにより可能*3
*1: PostgreSQLは同時に複数指定可能。すなわち、INSERTとUPDATE共有のコードがかけるということです。
例えば、イベントとしてINSERT or UPDATEのようなコードがかけます。Firebirdでも1.5から、これと同様にマルチアクションのトリガを書くことができるようになっています。マルチアクションはINSERT, UPDATE, DELETE単体か、それぞれをORで結んだ形で定義します。
CREATE TRIGGER name FOR table
[ACTIVE | INACTIVE]
{BEFORE | AFTER} <マルチアクション>
[POSITION 実行順]
AS terminator
また、Firebirdは、それぞれのアクションについて複数指定することができます。そのため、そのトリガの実行順序を「POSITION 実行順」で指定することが出来るようになっていて、その順番にトリガーが起動されます。デフォルトは0で、同じ番号のトリガーの実行順序は任意になりますので、順番が問題になる場合には、必ず
番号を指定するようにします。
*2:
カスケードは、例えばOracleは32個に制限されており、それ以下に設定することも可能です。
これは例えば、あるトリガーから発せられたSQLによりトリガーが発せらるような場合で、ヘタすると、それが無限ループになってしまう。それを防ぐような形で制限されている(のだと思います。それか、もしかしたら実装上の制限かもしれません)
勇気ある人は、無限にお互いを呼び合うようなトリガーを書いて、ご自分のプラットフォームで実行させてみてください。そして結果を木村まで知らせてください(^_^;)
*3:
処理と定義の分離。これはどちらかというとPostgreSQLが特殊なのだと思います。
ストアドプロシジャにすることにより、分離することはMySQLもFirebirdも行うことができます。Oracleのように最大サイズは32KBという制限があるデータベースもあります。
徹底比較!! PostgreSQL vs MySQLパート2 第7回:トリガ(1/4)
ここでの比較表のフォーマットでFirebirdについて書くと以下のようになります。
--------------------------------------------------------------------
仕様項目 Firebird
開発言語 PSQL
対応SQL文の種類 INSERT、UPDATE、DELETE、同時に複数指定可能。それぞれ複数指定可能*1
行単位/文単位 行単位のみ
BEFORE/AFTER 共に使用可能
NEW・OLD演算子 使用可能
カスケードの制限 制限設定不可*2
処理と定義の分離 工夫することにより可能*3
*1: PostgreSQLは同時に複数指定可能。すなわち、INSERTとUPDATE共有のコードがかけるということです。
例えば、イベントとしてINSERT or UPDATEのようなコードがかけます。Firebirdでも1.5から、これと同様にマルチアクションのトリガを書くことができるようになっています。マルチアクションはINSERT, UPDATE, DELETE単体か、それぞれをORで結んだ形で定義します。
CREATE TRIGGER name FOR table
[ACTIVE | INACTIVE]
{BEFORE | AFTER} <マルチアクション>
[POSITION 実行順]
AS
また、Firebirdは、それぞれのアクションについて複数指定することができます。そのため、そのトリガの実行順序を「POSITION 実行順」で指定することが出来るようになっていて、その順番にトリガーが起動されます。デフォルトは0で、同じ番号のトリガーの実行順序は任意になりますので、順番が問題になる場合には、必ず
番号を指定するようにします。
*2:
カスケードは、例えばOracleは32個に制限されており、それ以下に設定することも可能です。
これは例えば、あるトリガーから発せられたSQLによりトリガーが発せらるような場合で、ヘタすると、それが無限ループになってしまう。それを防ぐような形で制限されている(のだと思います。それか、もしかしたら実装上の制限かもしれません)
勇気ある人は、無限にお互いを呼び合うようなトリガーを書いて、ご自分のプラットフォームで実行させてみてください。そして結果を木村まで知らせてください(^_^;)
*3:
処理と定義の分離。これはどちらかというとPostgreSQLが特殊なのだと思います。
ストアドプロシジャにすることにより、分離することはMySQLもFirebirdも行うことができます。Oracleのように最大サイズは32KBという制限があるデータベースもあります。