トリガーについて聞いたことがありますが、いくつか質問があります。
トリガーとは
設定方法を教えてください。
典型的な SQL 以外に、取るべき予防策はありますか?
4 に答える
トリガーを使用すると、特定のイベント (テーブルへの挿入など) が発生したときに、データベースで機能を実行できます。
特にmysqlについてコメントすることはできません。
予防措置: トリガーは非常に魅力的です。最初にトリガーを使い始めると、あらゆる種類の問題に対する魔法の弾丸のように見えます。しかし、それらは「魔法のような」ことを引き起こします。データベースの内部を知らなければ、本当に奇妙なことが起こるように思えるかもしれません (他のテーブルへの挿入、入力データの変更など)。トリガーとして何かを実装する前に、代わりにスキーマの周りで API の使用を強制することを真剣に検討します (できればデータベース内で、できなければ外部で)。
まだトリガーを使用するいくつかのこと
- 「date_created」および「date_last_edited」フィールドの追跡
- 「ID」の挿入(自動IDフィールドがないOracleで)
- 変更履歴の保持
トリガーを使用したくないこと
- ビジネス ルール/ロジック
- データベースの外部に接続するもの (例: webservice 呼び出し)
- アクセス制御
- トランザクションではないもの (トリガーで行うことはすべて、トランザクションでロールバックできる必要があります)
dev.mysql.comから、トリガーは
...テーブルに関連付けられ、テーブルで特定のイベントが発生したときにアクティブ化される名前付きデータベース オブジェクト。
それらを作成するための構文も、そのサイトで文書化されています。
簡単に言えば、
CREATE
[DEFINER = { user | CURRENT_USER }]
TRIGGER trigger_name trigger_time trigger_event
ON tbl_name FOR EACH ROW trigger_stmt
そして、彼らは例を提供します:
CREATE TABLE account (acct_num INT, amount DECIMAL(10,2));
CREATE TRIGGER ins_sum BEFORE INSERT ON account FOR EACH ROW SET @sum = @sum + NEW.amount;
少なくとも、ストアド ファンクションに関するすべての制限に従う必要があります。テーブルをロックしたり、ビューを変更したり、トリガーをトリガーしたテーブルを変更したりすることはできません。また、トリガーによってレプリケーションの問題が発生する場合があります。
トリガーは、テーブルに関連付けられ、テーブルで特定のイベントが発生したときにアクティブ化される名前付きデータベース オブジェクトです。
トリガーを作成するには:
CREATE TRIGGER triggerName [BEFORE|AFTER] [INSERT|UPDATE|DELETE|REPLACE] ON tableName FOR EACH ROW SET stuffToDoHERE;
私はこの部分に答えましたが、他の質問はまだ残っています。
この質問は古く、他の回答は非常に優れていますが、ユーザーが取るべき予防策について尋ねたので、何かを追加したいと思います:
- 複雑な環境でレプリケーションを使用する場合は、トリガーを大量に使用しないでください。また、トリガーからストアド プロシージャを呼び出さないでください。
- MySQL ではトリガーが遅い。
- 一部の SQL ステートメントはトリガー内で使用できません。また、LOCK のように、一部のステートメントは許可されていますが、避ける必要があります。一般的なルールは次のとおりです。自分が行っていることの意味を完全に理解していない場合は、それを行うべきではありません。
- トリガーは無限ループを引き起こす可能性があるため、注意してください。