-- Table structure for tcharge
-- ----------------------------
CREATE TABLE `tcharge` (
`tid` int(10) NOT NULL AUTO_INCREMENT,
`method` char(16) NOT NULL,
`from_tag` char(64) NOT NULL,
`to_tag` char(64) NOT NULL,
`callid` char(64) NOT NULL,
`sip_code` char(3) NOT NULL,
`sip_reason` char(32) NOT NULL,
`caller` char(64) NOT NULL,
`callee` char(64) NOT NULL,
`time` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=55 DEFAULT CHARSET=utf8;INSERT INTO `tcharge` VALUES ('53', 'INVITE', '417bff32', '29572476', 'N2QxMTA1ZGU3MDA0MmE0MTY2YzZkNzc4NjM1YWY1ODE.', '200', 'OK', 'sip:[email protected]', 'sip:[email protected]', '2010-08-07 09:26:08');
INSERT INTO `tcharge` VALUES ('54', 'BYE', '29572476', '417bff32', 'N2QxMTA1ZGU3MDA0MmE0MTY2YzZkNzc4NjM1YWY1ODE.', '200', 'OK', 'sip:[email protected]', 'sip:[email protected]', '2010-08-07 09:26:13');
这个表的数据是成对出现的,callid相同的为一对,method里的INVITE表示成对数据的第一个,BYE表示第二个。
-- Table structure for uinfoe
-- ----------------------------
CREATE TABLE `uinfoe` (
`ID` int(100) NOT NULL AUTO_INCREMENT,
`TLEAVINGS` int(50) NOT NULL DEFAULT '0',
`TENDTIME` datetime NOT NULL DEFAULT '2000-01-01 00:00:00',
`USTATE` varchar(100) NOT NULL DEFAULT '0',
PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=2010000007 DEFAULT CHARSET=utf8;INSERT INTO `ctcm_en_userinfoes` VALUES ('2010000005', '20', '2011-01-24 21:42:29', '1');
INSERT INTO `ctcm_en_userinfoes` VALUES ('2010000006', '0', '2000-01-01 00:00:00', '0');
触发器1:tcharge表的成对数据全部插入后 method为BYE的那条数据的time减去INVITE那条数据的time,得到一个以秒为单位的值。然后uinfoe表的TLEAVINGS减去这个值。
触发器2:当uinfoe表的TLEAVINGS减少后,检查TLEAVINGS是否<=0,如果是,则USTATE更新为0,TLEAVINGS更新为0.如果否,则什么都不做。
触发器3:USTATE=1的数据 ,当TENDTIME里的时间<=当前时间时,USTATE更新为0
CREATE TABLE `tcharge` (
`tid` int(10) NOT NULL AUTO_INCREMENT,
`method` char(16) NOT NULL,
`from_tag` char(64) NOT NULL,
`to_tag` char(64) NOT NULL,
`callid` char(64) NOT NULL,
`sip_code` char(3) NOT NULL,
`sip_reason` char(32) NOT NULL,
`caller` char(64) NOT NULL,
`callee` char(64) NOT NULL,
`time` datetime NOT NULL,
PRIMARY KEY (`tid`)
) ENGINE=InnoDB AUTO_INCREMENT=55 DEFAULT CHARSET=utf8;
例uinfoe表里的数据:
INSERT INTO `uinfoe` VALUES ('2010000005', '20', '2011-01-24 21:42:29', '1');
INSERT INTO `uinfoe` VALUES ('2010000006', '0', '2000-01-01 00:00:00', '0');执行
INSERT INTO `tcharge` VALUES ('53', 'INVITE', '417bff32', '29572476', '2010000005', '200', 'OK', 'sip:[email protected]', 'sip:[email protected]', '2010-08-07 09:26:08');
INSERT INTO `tcharge` VALUES ('54', 'BYE', '29572476', '417bff32', '2010000005', '200', 'OK', 'sip:[email protected]', 'sip:[email protected]', '2010-08-07 09:26:13');需要达到的结果为:
uinfoe 表里id='2010000005'的TLEAVINGS数据减少为15;触发器2:当uinfoe表的TLEAVINGS减少后,检查TLEAVINGS是否<=0,如果是,则USTATE更新为0,TLEAVINGS更新为0.如果否,则什么都不做。
uinfoe 表里的TLEAVINGS数据是不断减少的,当减少<=0时,则
update UINFOE set USTATE='0' , TLEAVINGS='0'本人是个菜鸟,如发帖不规范或描述不清楚,还请前辈多多指教
DELIMITER $$
DROP TRIGGER IF EXISTS `ee`.`ntc`$$
CREATE TRIGGER `ee`.`ntc` BEFORE INSERT
ON `ee`.`tcharge`
FOR EACH ROW BEGIN
UPDATE uinfoe a INNER JOIN
(SELECT callid,SUM(TIMEDIFF(`time`,new.`time`)) AS aa FROM tcharge GROUP BY callid) b
ON a.id=new.callid
SET a.`TLEAVINGS`=`TLEAVINGS` +COALESCE(aa,0);
END$$DELIMITER ;2
DELIMITER $$
DROP TRIGGER IF EXISTS `ee`.`ntc1`$$
CREATE TRIGGER `ee`.`ntc1` BEFORE UPDATE
ON `ee`.`uinfoe`
FOR EACH ROW BEGIN
IF new.TLEAVINGS<=0 THEN
SET new.TLEAVINGS=0;
SET new.USTATE=0;
END IF;
END$$DELIMITER ;
FOR EACH ROW BEGIN
declare v_INVITE_time datetime;
if NEW.method = 'BYE' THEN
select time into v_INVITE_time
from tcharge
where callid=NEW.callid
and method='INVITE'
order by tid desc limit 1;
update uinfoe
set TLEAVINGS=TLEAVINGS-(UNIX_TIMESTAMP(new.time)-UNIX_TIMESTAMP(v_INVITE_time))
where ID=new.callid;
END IF;
END;
|delimiter ;mysql>
mysql> select * from uinfoe;
+------------+-----------+---------------------+--------+
| ID | TLEAVINGS | TENDTIME | USTATE |
+------------+-----------+---------------------+--------+
| 2010000005 | 20 | 2011-01-24 21:42:29 | 1 |
| 2010000006 | 0 | 2000-01-01 00:00:00 | 0 |
+------------+-----------+---------------------+--------+
2 rows in set (0.06 sec)mysql> select * from tcharge;
Empty set (0.02 sec)mysql> delimiter |
mysql>
mysql> CREATE TRIGGER tr_tcharge_ai_1 after INSERT ON tcharge
-> FOR EACH ROW BEGIN
-> declare v_INVITE_time datetime;
->
-> if NEW.method = 'BYE' THEN
-> select time into v_INVITE_time
-> from tcharge
-> where callid=NEW.callid
-> and method='INVITE'
-> order by tid desc limit 1;
->
-> update uinfoe
-> set TLEAVINGS=TLEAVINGS-(UNIX_TIMESTAMP(new.time)-UNIX_T
IMESTAMP(v_INVITE_time))
-> where ID=new.callid;
-> END IF;
-> END;
-> |
Query OK, 0 rows affected (0.03 sec)mysql>
mysql> delimiter ;
mysql> select * from uinfoe;
+------------+-----------+---------------------+--------+
| ID | TLEAVINGS | TENDTIME | USTATE |
+------------+-----------+---------------------+--------+
| 2010000005 | 20 | 2011-01-24 21:42:29 | 1 |
| 2010000006 | 0 | 2000-01-01 00:00:00 | 0 |
+------------+-----------+---------------------+--------+
2 rows in set (0.00 sec)mysql> INSERT INTO `tcharge` VALUES ('53', 'INVITE', '417bff32', '29572476', '20
10000005', '200', 'OK', 'sip:[email protected]', 'sip:[email protected]', '2
010-08-07 09:26:08');
Query OK, 1 row affected (0.01 sec)mysql> INSERT INTO `tcharge` VALUES ('54', 'BYE', '29572476', '417bff32', '20100
00005', '200', 'OK', 'sip:[email protected]', 'sip:[email protected]', '2010
-08-07 09:26:13');
Query OK, 1 row affected (0.00 sec)mysql> select * from tcharge;
+-----+--------+----------+----------+------------+----------+------------+-------------------------+-------------------------+---------------------+
| tid | method | from_tag | to_tag | callid | sip_code | sip_reason | caller | callee | time |
+-----+--------+----------+----------+------------+----------+------------+-------------------------+-------------------------+---------------------+
| 53 | INVITE | 417bff32 | 29572476 | 2010000005 | 200 | OK | sip:[email protected] | sip:[email protected] | 2010-08-07 09:26:08 |
| 54 | BYE | 29572476 | 417bff32 | 2010000005 | 200 | OK | sip:[email protected] | sip:[email protected] | 2010-08-07 09:26:13 |
+-----+--------+----------+----------+------------+----------+------------+-------------------------+-------------------------+---------------------+
2 rows in set (0.00 sec)mysql> select * from uinfoe;
+------------+-----------+---------------------+--------+
| ID | TLEAVINGS | TENDTIME | USTATE |
+------------+-----------+---------------------+--------+
| 2010000005 | 15 | 2011-01-24 21:42:29 | 1 |
| 2010000006 | 0 | 2000-01-01 00:00:00 | 0 |
+------------+-----------+---------------------+--------+
2 rows in set (0.00 sec)mysql>
FOR EACH ROW BEGIN
if new.TLEAVINGS<=0 then
set new.USTATE=0;
set new.TLEAVINGS=0;
end if;
END;
|delimiter ;
触发器一已经ok
触发器二我做了改动(红色部分)
CREATE TRIGGER tr_uinfoe_bi before updat ON uinfoe
FOR EACH ROW BEGIN
if new.TLEAVINGS<=0 then
set new.USTATE=0;
set new.TLEAVINGS=0;
end if;
END;
|触发器三:由于前几天时间紧张没写触发器三要求,请谅解触发器3
表uinfoe里所有USTATE=1的数据 ,当TENDTIME里的时间<=当前时间时,USTATE更新为0
2、
CREATE TRIGGER tr_uinfoe_bi before updat ON uinfoe
FOR EACH ROW BEGIN
if new.TLEAVINGS<=0 or TENDTIME <=now() then
set new.USTATE=0;
set new.TLEAVINGS=0;
end if;
END;
CREATE TABLE `uinfoe` (
`ID` int(100) NOT NULL AUTO_INCREMENT,
`TLEAVINGS` int(50) NOT NULL DEFAULT '0',
`TENDTIME` datetime NOT NULL DEFAULT '2000-01-01 00:00:00',
`USTATE` varchar(100) NOT NULL DEFAULT '0',
PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=2010000007 DEFAULT CHARSET=utf8;表里数据:
INSERT INTO `uinfoe` VALUES ('2010000005', '20', '2010-12-7 21:42:29', '1');
INSERT INTO `uinfoe` VALUES ('2010000006', '0', '2000-01-01 00:00:00', '0');触发器触发条件:
TENDTIME<=now() 并且 USTATE='1'(或每天定时触发)结果:
USTATE='0' TLEAVINGS=0
参考下贴。另征集定时执行mysql数据库任务方案。
http://topic.csdn.net/u/20091020/22/c51bb709-6dbc-4fd1-b874-077714ed547e.html