说表B
有一个BEFORE DELETE
触发器。但是,在某些情况下,我希望在尝试从B
删除某些内容时禁用触发器,这可能吗?
答案 0 :(得分:1)
在触发器中插入条件验证(if),以检查执行操作的条件是否会被执行
e.g:
create trigger ai_eav after insert on eav
for each row begin
set @id=new.entity;
set @attribute=new.attribute;
set @value=new.value;
if n > m then
update pivot set
Author=(select if(@attribute='Author',@value,Author)),
Title=(select if(@attribute='Title',@value,Title)),
Publisher=(select if(@attribute='Publisher',@value,Publisher))
where id=@id;
end if
end
你可以在这里找到mysql if语句的语法: http://dev.mysql.com/doc/refman/5.0/en/if.html
这个解决方案可能比删除和重新创建触发器更具性能
答案 1 :(得分:0)
对于v5。*: http://www.ehow.com/how_10027479_disable-triggers-mysql.html
只需删除并重新创建触发器。
对于v7.0: http://dev.mysql.com/worklog/task/?id=2825
ALTER TRIGGER ... ENABLE | DISABLE
#include <my_global.h>
#include <mysql.h>
#include <string.h>
#define TRIGGER_NAME "testtrigger"
int delete_without_trigger(MYSQL *conn,char *sql) {
if (mysql_query(conn, "SHOW CREATE TRIGGER " TRIGGER_NAME)) {
fprintf(stderr, "%s\n", mysql_error(conn));
return -1;
}
MYSQL_RES *res=mysql_use_result(conn);
MYSQL_ROW row= mysql_fetch_row(res);
char *trigger=strdup(row[2]);
//printf("TRIGGER==============\n%s\n===========\n",trigger);
mysql_free_result(res);
if (mysql_query(conn, "DROP TRIGGER " TRIGGER_NAME)) {
fprintf(stderr, "%s\n", mysql_error(conn));
return -2;
}
if (mysql_query(conn, sql)) {
fprintf(stderr, "%s\n", mysql_error(conn));
return -3;
}
if (mysql_query(conn, trigger)) {
fprintf(stderr, "%s\n", mysql_error(conn));
return -4;
}
free(trigger);
return 0;
}//delete_without_trigger
int i;
for(i=99;--i>0;) {
printf("%d\n",i);
if(delete_without_trigger(conn,"DELETE FROM syslog WHERE txt='test'")) {
fprintf(stderr, "handling ERROR\n");
exit(1);
}
}