问题描述:想为一组表创建触发器。实现时,创建了一个临时表,用来存储表名,然后循环,为各个表创建触发器。代码如下:
-- 临时表
CREATE TEMPORARY TABLE TABLIST (
ID INT NOT NULL AUTO_INCREMENT,
V_TABLE VARCHAR(128),
PRIMARY KEY(ID));
-- 创建触发器DROP PROCEDURE IF EXISTS TEXT_MODLOG_CreateTriggers //
CREATE PROCEDURE TEXT_MODLOG_CreateTriggers()
TEXT_MODLOG_CreateTriggers:BEGIN
DECLARE V_TABLE_P VARCHAR(128);
DECLARE v_num INT;
DECLARE p INT DEFAULT 0;
DECLARE V_TABLEname varchar(32);
INSERT INTO TABLIST(V_TABLE) VALUES ('aaaa');
INSERT INTO TABLIST(V_TABLE) VALUES ('bbbb'); select count(*) into v_num from TABLIST;
tt:LOOP
SET p =p +1;
select V_TABLE into V_TABLE_P from TABLIST where id=p;
set V_TABLEname := CONCAT( V_TABLE_P , '_MODLOG');
-- trigger after insert
SET @V_SQL := CONCAT('drop trigger if exists TRIG_FM_',V_TABLE_P,'_INSERT');
PREPARE stmt FROM @V_SQL;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET @V_SQL := CONCAT('create trigger TRIG_FM_' , V_TABLE_P ,'_INSERT', '
after insert on ' , V_TABLE_P , '
for each row
call TEXT_modlog_addorupdate(V_TABLEname, NEW.id, NEW.dbid, 0); ');
PREPARE stmt FROM @V_SQL;
EXECUTE stmt;
DEALLOCATE PREPARE stmt; IF p < LAST_INSERT_ID() THEN ITERATE tt ; END IF;
LEAVE tt;
END LOOP tt;
end TEXT_MODLOG_CreateTriggers;
//-- 调用存储过程创建触发器
call TEXT_MODLOG_CreateTriggers();
//运行结果是:
存储过程创建成功,但是调用时,出现如下的错误:
ERROR 1295 (HY000): This command is not supported in the prepared statement protocol yet
请问下,我哪里出问题了,并且该如何改正,谢谢大家乐。
-- 临时表
CREATE TEMPORARY TABLE TABLIST (
ID INT NOT NULL AUTO_INCREMENT,
V_TABLE VARCHAR(128),
PRIMARY KEY(ID));
-- 创建触发器DROP PROCEDURE IF EXISTS TEXT_MODLOG_CreateTriggers //
CREATE PROCEDURE TEXT_MODLOG_CreateTriggers()
TEXT_MODLOG_CreateTriggers:BEGIN
DECLARE V_TABLE_P VARCHAR(128);
DECLARE v_num INT;
DECLARE p INT DEFAULT 0;
DECLARE V_TABLEname varchar(32);
INSERT INTO TABLIST(V_TABLE) VALUES ('aaaa');
INSERT INTO TABLIST(V_TABLE) VALUES ('bbbb'); select count(*) into v_num from TABLIST;
tt:LOOP
SET p =p +1;
select V_TABLE into V_TABLE_P from TABLIST where id=p;
set V_TABLEname := CONCAT( V_TABLE_P , '_MODLOG');
-- trigger after insert
SET @V_SQL := CONCAT('drop trigger if exists TRIG_FM_',V_TABLE_P,'_INSERT');
PREPARE stmt FROM @V_SQL;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET @V_SQL := CONCAT('create trigger TRIG_FM_' , V_TABLE_P ,'_INSERT', '
after insert on ' , V_TABLE_P , '
for each row
call TEXT_modlog_addorupdate(V_TABLEname, NEW.id, NEW.dbid, 0); ');
PREPARE stmt FROM @V_SQL;
EXECUTE stmt;
DEALLOCATE PREPARE stmt; IF p < LAST_INSERT_ID() THEN ITERATE tt ; END IF;
LEAVE tt;
END LOOP tt;
end TEXT_MODLOG_CreateTriggers;
//-- 调用存储过程创建触发器
call TEXT_MODLOG_CreateTriggers();
//运行结果是:
存储过程创建成功,但是调用时,出现如下的错误:
ERROR 1295 (HY000): This command is not supported in the prepared statement protocol yet
请问下,我哪里出问题了,并且该如何改正,谢谢大家乐。
不明白“不如在EXCEL中把语句利用公式准备好”是什么意思?事实上,我有十六个表呢。怎么用这种方式实现呢?这种方式更简单,对吧?
如果要是用脚本实现,就必须一个个的创建吗?那也太麻烦了吧?我要为每个表创建三个触发器,然后有十六个表,我怕我脑袋会傻掉。
我想删除关于表bbbb的触发器
set ?:=concat(' TRIG_FM_',V_TABLE_P,'_INSERT');
drop trigger if exists ?//
问号的位置应该用什么形式代替呢?我尝试了@aa,他会直接报错;变量aa(用之前已声明过),但是他会直接把名为aa的触发器删除,而不是删除变量aa指代的触发器。
这种方法下该怎么操作呢?我是觉得excel的方法我不懂,不知道如何操作,而且要是逐一写,工作量太大,而且还没必要。所以既然prepare不支持这种创建和删除触发器的语句,那我直接执行它就是了。可是还是行不通。
按照大哥的提示,用excel做的(利用excel中的concatenate函数),谢谢了。