質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

2回答

4375閲覧

MYSQLでトリガーからストアドを使いたい

orlando

総合スコア10

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2017/05/26 18:22

###前提・実現したいこと
MYSQLでいろんなテーブルにトリガーを仕込みたいのですが
同じ設定なので、同じ処理を行うストアドを作成し、
コールするようにしたいと考えています。

###概要
いろんな更新系テーブルに使用フラグ、登録実行日時、登録実行ユーザー、
最終更新日時、最終更新ユーザー、削除日時、削除ユーザーを設けており、
使用フラグのON・OFFの切り替えで、削除日時、削除ユーザーを設定したいと考えています。

CREATE TABLE `table_a` ( ・・・ `INUSE` TINYINT(1) NULL DEFAULT NULL COMMENT '使用フラグ', `INSDATE` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '登録日', `LUPDATE` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最終更新日', `DELDATE` DATETIME NULL DEFAULT NULL COMMENT '削除日', `INSUSER` VARCHAR(20) NULL DEFAULT NULL COMMENT '登録担当者', `LUPUSER` VARCHAR(20) NULL DEFAULT NULL COMMENT '最終更新担当者', `DELUSER` VARCHAR(20) NULL DEFAULT NULL COMMENT '削除担当者', PRIMARY KEY (`T_ID`) )

挿入直前トリガー

#削除時の対応 CASE WHEN NEW.INUSE = 0 OR NEW.INUSE is NULL THEN SET NEW.DELDATE = CURRENT_TIMESTAMP; SET NEW.DELUSER = NEW.LUPUSER; WHEN NEW.INUSE = 1 THEN SET NEW.DELDATE = NULL; SET NEW.DELUSER = NULL; ELSE BEGIN END; END CASE

更新直前トリガー

#削除時の対応 CASE WHEN OLD.INUSE = 1 AND ( NEW.INUSE = 0 OR NEW.INUSE is NULL) THEN SET NEW.DELDATE = CURRENT_TIMESTAMP; SET NEW.DELUSER = NEW.LUPUSER; WHEN ( NEW.INUSE = 0 OR NEW.INUSE is NULL) AND NEW.INUSE = 1 THEN SET NEW.DELDATE = NULL; SET NEW.DELUSER = NULL; ELSE BEGIN END; END CASE

この挿入時トリガー、更新時トリガーをストアドにするには、引数をどう指定すればいいのでしょうか?更新系テーブルが10個あれば10個、挿入トリガー、更新トリガーが必要になるので、ストアドは1本にまとめなくても、せめて2本にまとめられるなら、御の字です。

できるなら、トリガーにNEW,OLDのデータすべてを渡したいのですが・・・。

この質問の実現可否を含め、回答できる方がいらっしゃいましたら是非教えていただけるとありがたいです。

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ahodana

2017/05/28 23:38

そのストアドを呼び出すトリガーを作らないとならないけど。テーブル名、旧フラグ、新フラグ、ユーザー名てとこか
guest

回答2

0

テーブル名を引数にして、CONCATで連結してSQLとして実行すれば実現可能だったと思いますが、通常はお勧めしません。
シンプルなトリガーで実現できることを、動的なSQLのストアドで共通化しても、ストアドの動作検証の方が面倒だと思います。
ユーザー定義関数 (UDF) で対応する方法もありますが、これも特殊なパターン以外は利用しないでしょう。

SQL

1DELIMITER \\ 2DROP PROCEDURE IF EXISTS `hoge`\\ 3CREATE PROCEDURE `hoge`( 4 IN `tbl_name` VARCHAR(1000), 5 IN `colmun_01` VARCHAR(1000), 6 IN `value_01` VARCHAR(1000), 7) 8BEGIN 9 SET @query = CONCAT('UPDATE `', tbl_name, '` SET `', colmun_01,'` = ?'); 10 PREPARE stmt from @query; 11 12 SET @val = value_01; 13 14 EXECUTE stmt USING @val; 15 DEALLOCATE PREPARE stmt; 16END 17\\ 18DELIMITER ;

投稿2017/06/27 10:05

shoko1

総合スコア372

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

orlando

2018/05/27 08:08

結局、テーブル毎に、トリガーを創りました。 ただ、各トリガーから呼び出す別の関数は統一しましたが、そこに参考にさせていただきました。 ありがとうございました。
guest

0

ベストアンサー

ちょっと状況がわからないのですが、
同じプロシージャをつかうということはカラム名などある程度もしくは完全に
テーブル構成が一緒だということでしょうか?
それであればテーブル自体を一つにするほうが現実的だと思います。

なおどうしてもテーブルを分ける必要があり、くわえてカラム名なども
任意のものを渡したいということであれば、プロシージャに引数として
任意の文字をわたしprepare処理をすることになるかと思います

ただ共用の汎用プロシージャとなると一つのテーブルに対して拡張をすると
他に影響がでるので、肥大化しがちで、やれることも制限がおおくなると思います
テーブルごとにトリガーを設定した方がいいと思いますけどね

投稿2017/05/29 01:34

yambejp

総合スコア114839

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

orlando

2018/05/27 08:07

結局、テーブル毎に、トリガーを創りました。 ただ、各トリガーから呼び出す別の関数は統一することで、何とかしのぎました。 解決しようとして、最短距離の方法は、ご推察の通りとなりました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問