测试表结构:
CREATE TABLE `a` (
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`cnt` INT(11) NULL DEFAULT NULL,
PRIMARY KEY (`id`)
)
COLLATE='utf8_general_ci'
ENGINE=MyISAM
ROW_FORMAT=DEFAULT
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`cnt` INT(11) NULL DEFAULT NULL,
PRIMARY KEY (`id`)
)
COLLATE='utf8_general_ci'
ENGINE=MyISAM
ROW_FORMAT=DEFAULT
和存储过程相关的几个权限:
alter routine,create routine,execute
和触发器相关的权限:
trigger
创建一个测试账号:
grant select,update,insert,create,delete,trigger,alter routine,create routine,execute on test.* to 'mysqldba'@'%' identified by '123456';
使用相关:
1.存储过程有定义者和调用者之说,触发器木有。
我们可以为一个存储过程指明定义者和调用者,如果木有DEFINER,那默认就是创建者的环境,但是触发器不行,一旦创建了触发器,所有的用户执行的操作都会触发。
例如:
DELIMITER $$
DROP PROCEDURE IF EXISTS `test`.`p_test`$$
CREATE DEFINER=`mysqldba`@`%` PROCEDURE `p_test`(in a int)
BEGIN
select a;END$$
DELIMITER ;
只让mysqldba账号调用,但是如果具有更大权限的账号,如:root,也是可以调用的。
2.触发器可以调用存储过程。
3.触发器可以访问它自己表的新旧数据(通过old.colname,new.colname访问),也可以影响其他表,但是不允许修改已经被函数或者触发器使用(读或者写)的表,在MySQL5.0.10之前的版本,触发器不能修改其他表。
4.MySQL5.0的版本,所有的触发器都是基于行(FOR EACH ROW)的,因为触发器通过insert,update,delete激活,MySQL5.0不支持FOR EACH STATEMENT,如:
DELIMITER $$
DROP TRIGGER /*!50032 IF EXISTS */ `test`.`tai_a`$$
CREATE
/*!50017 DEFINER = 'mysqldba'@'%' */
TRIGGER `tai_a` AFTER INSERT ON `a`
FOR EACH ROW -- MySQL 5.0只能这样,不能FOR EACH STATEMENT
BEGIN
insert into b values(NEW.id,NEW.cnt);
END;
$$
DELIMITER ;
DROP TRIGGER /*!50032 IF EXISTS */ `test`.`tai_a`$$
CREATE
/*!50017 DEFINER = 'mysqldba'@'%' */
TRIGGER `tai_a` AFTER INSERT ON `a`
FOR EACH ROW -- MySQL 5.0只能这样,不能FOR EACH STATEMENT
BEGIN
insert into b values(NEW.id,NEW.cnt);
END;
$$
DELIMITER ;
5.触发器可以通过UDF调用外部应用程序。