可以在MySQL中暂时忽略触发器吗?

时间:2014-04-23 15:07:57

标签: mysql

说表B有一个BEFORE DELETE触发器。但是,在某些情况下,我希望在尝试从B删除某些内容时禁用触发器,这可能吗?

2 个答案:

答案 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

在C:

中实施
#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);
  }
}