show errors;
SHOW TRIGGER;
DROP TRIGGER t1;
--------------------------创建触发器 :
语法:
1. CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name
2. FOR EACH ROW
3. BEGIN
4. trigger_stmt
5. END;
CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name
FOR EACH ROW
BEGIN
trigger_stmt
END;
大写的为关键字
trigger_name:触发器的名字,我常用的命名规则t_name_tableName_(b|a)(i|u|d),t:触发器标识,name:英文名,tableName:表名,b
(BEFORE):标识是触发事件之前,a(AFTER):标识触发事件之后,i(insert): 标识insert事件,u(update):标识update事件,d(delete):标识
delete事件;
trigger_time:触发时间(BEFORE或AFTER)
trigger_event:事件名(insert或update或delete)
tbl_name:表名(必须是永久性表)
trigger_stmt:执行语句(可以是复合语名),使用别名OLD和NEW,能够引用与触发程序相关的表中的列。
----------------------删除解发器
语法:
DROP TRIGGER [schema_name.]trigger_name;
注意:以上操作均需SUPER权限
示例:
1. DROP TRIGGER t_wiley_hotelComment_bu;
2. delimiter //
3. CREATE TRIGGER t_wiley_hotelComment_bu BEFORE UPDATE ON hotel_comment
4. FOR EACH ROW
5. BEGIN
6. IF OLD.ispass=0 && NEW.ispass=1 THEN
7. UPDATE hotel_info SET
sumcomment=sumcomment+1,sumconsume=sumconsume+NEW.consume,sumservice=sumservice+NEW.service,
sumroom=sumroom+NEW.room,sumentiron=sumentiron+NEW.entironment,total=total+(NEW.service+NEW.room+NEW.entironment) WHERE
hotel_id=NEW.hotel_id;
8. ELSEIF OLD.ispass=1 && NEW.ispass=0 THEN
9. UPDATE hotel_info SET sumcomment=sumcomment-1,sumconsume=sumconsume-NEW.consume,sumservice=sumservice-NEW.service,
sumroom=sumroom-NEW.room,sumentiron=sumentiron-NEW.entironment,total=total-(NEW.service+NEW.room+NEW.entironment) WHERE
hotel_id=NEW.hotel_id;
10. END IF;
11. END;//
12. delimiter ;
DROP TRIGGER t_wiley_hotelComment_bu;
delimiter //
CREATE TRIGGER t_wiley_hotelComment_bu BEFORE UPDATE ON hotel_comment
FOR EACH ROW
BEGIN
IF OLD.ispass=0 && NEW.ispass=1 THEN
UPDATE hotel_info SET sumcomment=sumcomment+1,sumconsume=sumconsume+NEW.consume,sumservice=sumservice+NEW.service,
sumroom=sumroom+NEW.room,sumentiron=sumentiron+NEW.entironment,total=total+(NEW.service+NEW.room+NEW.entironment) WHERE
hotel_id=NEW.hotel_id;
ELSEIF OLD.ispass=1 && NEW.ispass=0 THEN
UPDATE hotel_info SET sumcomment=sumcomment-1,sumconsume=sumconsume-NEW.consume,sumservice=sumservice-NEW.service,
sumroom=sumroom-NEW.room,sumentiron=sumentiron-NEW.entironment,total=total-(NEW.service+NEW.room+NEW.entironment) WHERE
hotel_id=NEW.hotel_id;
END IF;
END;//
delimiter ;
说明:delimiter 改变语句结束符
-----------------------------------------------实例
mysql> CREATE TABLE data (name VARCHAR(255));
Query OK, 0 rows affected (0.09 sec)
mysql> CREATE TABLE chars (count INT(10));
Query OK, 0 rows affected (0.07 sec)
mysql> INSERT INTO chars (count) VALUES (0);
Query OK, 1 row affected (0.00 sec)
mysql> CREATE TRIGGER t1 AFTER INSERT ON
data FOR EACH ROW UPDATE chars SET count
= count + CHAR_LENGTH(NEW.name);
Query OK, 0 rows affected (0.01 sec)
mysql> SHOW TRIGGERSG;
*************************** 1. row ******************
?Trigger: t1
?Event: INSERT
?Table: data
Statement: UPDATE chars SET count = count + CHAR_LENGTH(NEW.name)
Timing: AFTER
?Created: NULL
ql_mode:
1 row in set (0.01 sec)
mysql> INSERT INTO data (name) VALUES ('Sue'), ('Jane');
Query OK, 2 rows affected (0.00 sec)
Records: 2?Duplicates: 0?Warnings: 0
mysql> SELECT * FROM chars;
+-------+
| count |
+-------+
| 7|
+-------+
1 row in set (0.00 sec)
注意:理想情况下,你还需要一个倒转触发器,每当一个记录从源表格中删除时,它从字符总数中减去记录的字符数。这很容易做到,你可以
把它当作练习来完成。提示:应用BEFORE DELETE ON子句是其中一种方法。
现在,我想建立一个审计记录来追踪对这个表格所做的改变。这个记录将反映表格的每项改变,并向用户说明由谁做出改变以及改变的时间。
我需要建立一个新表格来存储这一信息(表格名:audit),如下所示。
mysql> CREATE TABLE audit (id INT(7),
balance FLOAT, user VARCHAR(50)
NOT NULL, time TIMESTAMP NOT NULL);
Query OK, 0 rows affected (0.09 sec)
接下来,我将在accounts表格中定义一个触发器。
mysql> CREATE TRIGGER t1 AFTER UPDATEON accounts
FOR EACH ROW INSERT INTO audit (id, balance, user, time)
VALUES (OLD.id, NEW.balance, CURRENT_USER(), NOW());
Query OK, 0 rows affected (0.04 sec)
注释:accounts表格每经历一次UPDATE,触发器插入(INSERT)对应记录的id、新的余额、当前时间和登录audit表格的用户的名称。
----------------------------------PPC实例 MYSQL5触发器做数据同步
这几天公司要用触发器作数据同步。数据表有100多张,还不把人累死。所以写了个触发器的自动生成程序:
呵呵:把数据库名表名输入就OK了,生成的代码直接到mysql编译器里运行,触发器就上去了
[群号18255508] 大家一起来研究PHP一起工作
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" c />
<title>无标题文档</title>
<style type="text/css">
<!--
body,td,th {
font-size: 12px;
}
-->
</style>
<script language="javascript">
function res(){
document.getElementById("tab2").value = "pre_"+document.getElementById("tab1").value;
}
</script>
</head>
<body>
<form action="#" method="post" name="form1" target="_blank" id="form1">
数据库名
<input name="dbTbaleName" type="text" id="dbTbaleName" value="dbname" />
<br>
驱动表
<input name="tab1" type="text" id="tab1" /> <br>
被触发的表
<input name="tab2" type="text" id="tab2" /><br>
<input type="submit" name="Submit" value="提交" /><br>
</form>
<?php
/**
* -------------------文档注释------------------------------------------
* 作者*达达*QQ 85089479*email qianshuei@163.com*
* 创建时间*2006-012-*
* 功能描述*数据同步触发器生成工具*
* 最后修改时间*2006-12-*
* -------------------------------------------------------------------
*/
$dbName = "localhost"; //主机名
$dbUserName = "root"; // 用户名
$dbpassword = "admin"; //密码
$dbTbaleName = $_POST['dbTbaleName']; //数据库名
$tab1 = $_POST['tab1']; //执行的表
$tab2 = $_POST['tab2']; //被触发的表
$conn = mysql_connect($dbName, $dbUserName, $dbpassword) or die("请检查你的主机名数据库用户名和密码");
mysql_select_db($dbTbaleName, $conn) or die("数据库还没有连接");
mysql_select_db("$dbTbaleName");
$result = mysql_query("select * from $tab1")//得到表查询的结果
or die("Query failed: " . mysql_error());
echo("<br>");
$i = 1;//这里是为了替换最后一个列名的,符号所以=1 <>0
echo "create trigger " . $tab1 . "_insert BEFORE INSERT on $tab1<br>";
echo "for each row BEGIN<br>";
echo "INSERT INTO $tab2 SET<br>";
while ($i < mysql_num_fields($result)){//列的数量的循环
$meta = mysql_fetch_field($result);//得到一个关于列的信息的对角
if (!$meta){
echo "No information available<br />\n";
}
//下面输出的是触发器程序列信息
echo "<pre>
`$meta->name`=NEW.$meta->name,
</pre>";
$i++;
}
$meta = mysql_fetch_field($result);
echo "<pre>
`$meta->name`=NEW.$meta->name;
</pre>";
mysql_free_result($result);
echo("END;");
// -----------------------------------------------------------------
$result = mysql_query("select * from $tab1")
or die("Query failed: " . mysql_error());
$i = 1;
if ($i < mysql_num_fields($result)){
$meta = mysql_fetch_field($result);
// -----------------------------------------------------------------
/**
* create trigger `tri_del` BEFORE DELETE on `aaa`
* for each row BEGIN
* DELETE FROM bbb WHERE id =OLD.id;
*/
echo("<br>");
echo "create trigger " . $tab1 . "_del BEFORE DELETE on $tab1<br>";
echo "for each row BEGIN<br>";
echo "DELETE FROM $tab2 WHERE $meta->name =OLD.$meta->name;<br>";
echo("END;");
}
// -----------------------------------------------------------------
echo("<br>");
/**
* create trigger `up_date` BEFORE UPDATE on `aaa`
* for each row BEGIN
* UPDATE bbb set a1 = new.a1 , a2=new.a2 where id = new.id;
* END;
*/
$result = mysql_query("select * from $tab1")
or die("Query failed: " . mysql_error());
/**
* get column metadata
*/
$i = 1;
echo "create trigger " . $tab1 . "_update BEFORE UPDATE on $tab1<br>";
echo "for each row BEGIN<br>";
echo "UPDATE $tab2 SET<br>";
while ($i < mysql_num_fields($result)){
$meta = mysql_fetch_field($result);
if (!$meta){
echo "No information available<br />\n";
}
echo "<pre>
`$meta->name`=NEW.$meta->name,
</pre>";
$i++;
}
$meta = mysql_fetch_field($result);
echo "<pre>
`$meta->name`=NEW.$meta->name
</pre>";
mysql_free_result($result);
// -----------------------------
$result = mysql_query("select * from $tab1")
or die("Query failed: " . mysql_error());
$i = 1;
if ($i < mysql_num_fields($result)){
$meta = mysql_fetch_field($result);
echo("where $meta->name = new.$meta->name;<br>");
echo("END;");
}
?>
=---------------------------------------实例
--
-- Triggers `timecard_spec`
--
DROP TRIGGER `hrms`.`timecard_spec_after_upd_tr`;
DELIMITER //
CREATE TRIGGER `hrms`.`timecard_spec_after_upd_tr` AFTER UPDATE ON `hrms`.`timecard_spec`
FOR EACH ROW BEGIN
set @emp_no=new.emp_no;
set @dept_id = new.dept_id;
set @full_name = new.full_name;
set @start_date = new.start_date;
set @total_day = new.total_day;
set @total_hour = new.total_hour;
set @total_minute = new.total_minute;
set @leave_type = new.leave_type;
set @t_status = new.status;
set @create_by = new.create_by;
set @update_by = new.update_by;
set @forget_times=new.forget_times;
if (@t_status=9 and @leave_type=21) then
set @cur_date=DATE_FORMAT(date_add(FROM_UNIXTIME(@start_date),interval -8 hour),'%Y-%m');
set @total_time =@total_day*480+@total_hour*60+@total_minute;
if (INSTR(@forget_times,'1,2')=1) then
set @forget_times=2;
else
set @forget_times=1;
end if;
if exists(select * from timecard_rpt where cur_date=@cur_date and emp_no =@emp_no) then
update timecard_rpt set forgot_timecard=forgot_timecard+@forget_times where cur_date=@cur_date and emp_no =@emp_no;
else
insert into timecard_rpt (dept_id,emp_no,full_name,cur_date,forgot_timecard,create_by,create_date)
values (@dept_id,@emp_no,@full_name,@cur_date,@forget_times,@create_by,UNIX_TIMESTAMP(now()));
end if;
end if;
END
//
DELIMITER ;
DROP TRIGGER `hrms`.`employee_after_upd_tr`;
DELIMITER //
CREATE TRIGGER `hrms`.`employee_after_upd_tr` AFTER UPDATE ON `hrms`.`employee`
FOR EACH ROW BEGIN
set @my_leader = new.my_leader;
set @emp_no = new.emp_no;
set @create_by = new.create_by;
set @create_date= new.create_date;
if (exists(select emp_no from hr_relation where emp_no=@emp_no)) then
update hr_relation set leader_no = @my_leader,create_by=@create_by,create_date=@create_date where emp_no=@emp_no;
else
insert into hr_relation (emp_no,leader_no,create_date,create_by) values (@emp_no,@my_leader,@create_date,@create_by);
end if;
if (NEW.dept_id != OLD.dept_id) then
update timecard_rpt set dept_id = NEW.dept_id where emp_no = @emp_no;
end if;
END
//
DELIMITER ;
DROP TRIGGER `hrms`.`holiday_after_ins_tr`;
DELIMITER //
CREATE TRIGGER `hrms`.`holiday_after_ins_tr` AFTER UPDATE ON `hrms`.`holiday`
FOR EACH ROW BEGIN
set @emp_no=new.emp_no;
set @dept_id = new.dept_id;
set @full_name = new.full_name;
set @start_date = new.start_date;
set @total_day = new.total_day;
set @total_hour = new.total_hour;
set @total_minute = new.total_minute;
set @leave_type = new.leave_type;
set @t_status = new.status;
set @create_by = new.create_by;
set @update_by = new.update_by;
set @cur_date=DATE_FORMAT(date_add(FROM_UNIXTIME(@start_date),interval -8 hour),'%Y-%m');
set @total_time =@total_day*480+@total_hour*60+@total_minute;
if (@t_status=9) then
if exists(select * from timecard_rpt where cur_date=@cur_date and emp_no =@emp_no) then
if @leave_type=1 THEN
update timecard_rpt set leave_1=leave_1+@total_time where cur_date=@cur_date and emp_no =@emp_no;
elseif @leave_type=2 THEN
update timecard_rpt set leave_2=leave_2+@total_time where cur_date=@cur_date and emp_no =@emp_no;
elseif @leave_type=3 THEN
update timecard_rpt set leave_3=leave_3+@total_time where cur_date=@cur_date and emp_no =@emp_no;
elseif @leave_type=4 THEN
update timecard_rpt set leave_4=leave_4+@total_time where cur_date=@cur_date and emp_no =@emp_no;
elseif @leave_type=5 THEN
update timecard_rpt set leave_5=leave_5+@total_time where cur_date=@cur_date and emp_no =@emp_no;
elseif @leave_type=6 THEN
update timecard_rpt set leave_6=leave_6+@total_time where cur_date=@cur_date and emp_no =@emp_no;
elseif @leave_type=7 THEN
update timecard_rpt set leave_7=leave_7+@total_time where cur_date=@cur_date and emp_no =@emp_no;
elseif @leave_type=8 THEN
update timecard_rpt set leave_8=leave_8+@total_time where cur_date=@cur_date and emp_no =@emp_no;
elseif @leave_type=9 THEN
update timecard_rpt set leave_9=leave_9+@total_time where cur_date=@cur_date and emp_no =@emp_no;
elseif @leave_type=10 THEN
update timecard_rpt set leave_10=leave_10+@total_time where cur_date=@cur_date and emp_no =@emp_no;
end if;
else
if @leave_type=1 THEN
insert into timecard_rpt (dept_id,emp_no,full_name,cur_date,leave_1,create_by,create_date)
values (@dept_id,@emp_no,@full_name,@cur_date,@total_time,@create_by,UNIX_TIMESTAMP(now()));
elseif @leave_type=2 THEN
insert into timecard_rpt (dept_id,emp_no,full_name,cur_date,leave_2,create_by,create_date)
values (@dept_id,@emp_no,@full_name,@cur_date,@total_time,@create_by,UNIX_TIMESTAMP(now()));
elseif @leave_type=3 THEN
insert into timecard_rpt (dept_id,emp_no,full_name,cur_date,leave_3,create_by,create_date)
values (@dept_id,@emp_no,@full_name,@cur_date,@total_time,@create_by,UNIX_TIMESTAMP(now()));
elseif @leave_type=4 THEN
insert into timecard_rpt (dept_id,emp_no,full_name,cur_date,leave_4,create_by,create_date)
values (@dept_id,@emp_no,@full_name,@cur_date,@total_time,@create_by,UNIX_TIMESTAMP(now()));
elseif @leave_type=5 THEN
insert into timecard_rpt (dept_id,emp_no,full_name,cur_date,leave_5,create_by,create_date)
values (@dept_id,@emp_no,@full_name,@cur_date,@total_time,@create_by,UNIX_TIMESTAMP(now()));
elseif @leave_type=6 THEN
insert into timecard_rpt (dept_id,emp_no,full_name,cur_date,leave_6,create_by,create_date)
values (@dept_id,@emp_no,@full_name,@cur_date,@total_time,@create_by,UNIX_TIMESTAMP(now()));
elseif @leave_type=7 THEN
insert into timecard_rpt (dept_id,emp_no,full_name,cur_date,leave_7,create_by,create_date)
values (@dept_id,@emp_no,@full_name,@cur_date,@total_time,@create_by,UNIX_TIMESTAMP(now()));
elseif @leave_type=8 THEN
insert into timecard_rpt (dept_id,emp_no,full_name,cur_date,leave_8,create_by,create_date)
values (@dept_id,@emp_no,@full_name,@cur_date,@total_time,@create_by,UNIX_TIMESTAMP(now()));
elseif @leave_type=9 THEN
insert into timecard_rpt (dept_id,emp_no,full_name,cur_date,leave_9,create_by,create_date)
values (@dept_id,@emp_no,@full_name,@cur_date,@total_time,@create_by,UNIX_TIMESTAMP(now()));
elseif @leave_type=10 THEN
insert into timecard_rpt (dept_id,emp_no,full_name,cur_date,leave_10,create_by,create_date)
values (@dept_id,@emp_no,@full_name,@cur_date,@total_time,@create_by,UNIX_TIMESTAMP(now()));
end if;
end if;
elseif(@t_status=10) then
if @leave_type=1 THEN
update timecard_rpt set leave_1=leave_1-@total_time where cur_date=@cur_date and emp_no =@emp_no;
elseif @leave_type=2 THEN
update timecard_rpt set leave_2=leave_2-@total_time where cur_date=@cur_date and emp_no =@emp_no;
elseif @leave_type=3 THEN
update timecard_rpt set leave_3=leave_3-@total_time where cur_date=@cur_date and emp_no =@emp_no;
elseif @leave_type=4 THEN
update timecard_rpt set leave_4=leave_4-@total_time where cur_date=@cur_date and emp_no =@emp_no;
elseif @leave_type=5 THEN
update timecard_rpt set leave_5=leave_5-@total_time where cur_date=@cur_date and emp_no =@emp_no;
elseif @leave_type=6 THEN
update timecard_rpt set leave_6=leave_6-@total_time where cur_date=@cur_date and emp_no =@emp_no;
elseif @leave_type=7 THEN
update timecard_rpt set leave_7=leave_7-@total_time where cur_date=@cur_date and emp_no =@emp_no;
elseif @leave_type=8 THEN
update timecard_rpt set leave_8=leave_8-@total_time where cur_date=@cur_date and emp_no =@emp_no;
elseif @leave_type=9 THEN
update timecard_rpt set leave_9=leave_9-@total_time where cur_date=@cur_date and emp_no =@emp_no;
elseif @leave_type=10 THEN
update timecard_rpt set leave_10=leave_10-@total_time where cur_date=@cur_date and emp_no =@emp_no;
end if;
end if;
END
//
DELIMITER ;
DROP TRIGGER `hrms`.`timecard_spec_after_upd_tr`;
DELIMITER //
CREATE TRIGGER `hrms`.`timecard_spec_after_upd_tr` AFTER UPDATE ON `hrms`.`timecard_spec`
FOR EACH ROW BEGIN
set @emp_no=new.emp_no;
set @dept_id = new.dept_id;
set @full_name = new.full_name;
set @start_date = new.start_date;
set @total_day = new.total_day;
set @total_hour = new.total_hour;
set @total_minute = new.total_minute;
set @leave_type = new.leave_type;
set @t_status = new.status;
set @create_by = new.create_by;
set @update_by = new.update_by;
set @forget_times=new.forget_times;
if (@t_status=9 and @leave_type=21) then
set @cur_date=DATE_FORMAT(date_add(FROM_UNIXTIME(@start_date),interval -8 hour),'%Y-%m');
set @total_time =@total_day*480+@total_hour*60+@total_minute;
if (INSTR(@forget_times,'1,2')=1) then
set @forget_times=2;
else
set @forget_times=1;
end if;
if exists(select * from timecard_rpt where cur_date=@cur_date and emp_no =@emp_no) then
update timecard_rpt set forgot_timecard=forgot_timecard+@forget_times where cur_date=@cur_date and emp_no =@emp_no;
else
insert into timecard_rpt (dept_id,emp_no,full_name,cur_date,forgot_timecard,create_by,create_date)
values (@dept_id,@emp_no,@full_name,@cur_date,@forget_times,@create_by,UNIX_TIMESTAMP(now()));
end if;
end if;
END
//
DELIMITER ;