考虑以下触发器和事件
架构:
CREATE SCHEMA triggerTest;
USE triggerTest;
DROP TABLE IF EXISTS account;
CREATE TABLE account
( id INT auto_increment PRIMARY KEY,
acct_num INT NOT NULL,
amount DECIMAL(10,2) NOT NULL,
insertDT DATETIME NOT NULL,
updtBy VARCHAR(100) NULL -- user (or 'EVENTx' see below) that did the last insert
)ENGINE=InnoDB;
插入触发器:
DROP TRIGGER IF EXISTS acctBefInsTrig;
DELIMITER $$
CREATE TRIGGER acctBefInsTrig BEFORE INSERT ON account
FOR EACH ROW
BEGIN
SET NEW.updtBy = @theVar;
END;$$
DELIMITER ;
事件:
DROP EVENT IF EXISTS `myEvt001`;
DELIMITER $$
CREATE EVENT myEvt001
ON SCHEDULE EVERY 1 MINUTE STARTS '2016-01-01 00:00:00'
ON COMPLETION PRESERVE
DO
BEGIN
SET @theVar='myEvt001';
INSERT account(acct_num,amount,insertDT) VALUES (102,2000,NOW());
END $$
DELIMITER ;
测试:
SHOW VARIABLES WHERE variable_name='event_scheduler';
SET GLOBAL event_scheduler = ON;
SET @theVar='Joe'; -- run this only once
SELECT @theVar; -- LINE A1
INSERT account(acct_num,amount,insertDT) VALUES (102,1000,NOW());
SELECT * FROM account; -- watch the Event put a new row in every minute
SET GLOBAL event_scheduler = OFF;
SELECT * FROM account;
+----+----------+---------+---------------------+----------+
| id | acct_num | amount | insertDT | updtBy |
+----+----------+---------+---------------------+----------+
| 1 | 102 | 2000.00 | 2016-08-08 14:03:00 | myEvt001 |
| 2 | 102 | 1000.00 | 2016-08-08 14:03:17 | Joe |
| 3 | 102 | 2000.00 | 2016-08-08 14:04:00 | myEvt001 |
| 4 | 102 | 1000.00 | 2016-08-08 14:04:27 | Joe |
+----+----------+---------+---------------------+----------+
清理:
DROP SCHEMA triggerTest;
简短的叙述。如果我在一个用户连接(MySQL Workbench,一个应用程序)中创建一个用户变量(一个带有 @ 符号的变量),那么插入触发器将拾取它。与之配合的是显示的事件,它在一个单独的线程中运行,它有自己的连接和它自己的用户变量@theVar 的实例。它们不会相互干扰或相互覆盖。
上面的LINE A1 可以重复运行以显示事件不会覆盖我们的用户变量,因为它有自己的。
对于带有用户变量的存储过程和触发器也是如此。如果设置了用户变量@theVar,则可用。