2016-09-11 7 views
0

私は、トリガのテーブルに新しい列を追加したいが、それはがトリガーと挿入した後、カラムを追加、エラー1422

DELIMITER // 
DROP TRIGGER IF EXISTS add_dep_oncall// 
CREATE TRIGGER add_dep_oncall 
AFTER INSERT ON `department` 
FOR EACH ROW 
BEGIN 

DECLARE col_name varchar(30); 
SET col_name = NEW.department_name; 

ALTER TABLE `oncall` ADD COLUMN col_name VARCHAR(255) DEFAULT NULL; 

END// 

を働いていない私はmariadbを使用しています。

上記のコードの実行SQLた後にエラーが

Explicit or implicit commit is not allowed in stored function or trigger. 

では、任意の助けをありがとうございました。

答えて

3

ストアド・ファンクションとトリガーではトランザクションとコミット(明示的なコミット)とDDL操作(暗黙的なコミット)は許可されません。

DML - データ操作言語。データを取得および設定する操作。これらはトリガーに焦点を当てるべきです。

DDL - データ定義言語。テーブルの構造を変更する操作。これらは決して引き金になるべきではありません。

したがって、ALTER TABLEはDDLであり、許可されていません。

さらに、DDLルーチンは時間がかかります。 ALTER TABLEには数分または数時間かかることがあります。たとえそれがデーモンによって許可されたとしても、高性能RDBMSの適切な使用に関するピアレビューでは存続しません。手元にあるスキーマをセットアップして使用してください。より多くのステージングされたデータの移行または変換を除いて、オンザフライで列を追加しないでください。

フライイントリガーに列を追加することについてスタックにいくつかの質問がありました。特に新しい開発者からSQLへの移行は、列を追加する「オンザフライ」と考える方が理にかなっています。それは決してしません。これは、通常、貧弱な設計思想の指標です。同様に、今年は新しい週です。新しい列を追加しましょう。

ライブトリガーはDDL用の場所ではありません。

関連する問題