技术开发 频道

MySQL存储过程和触发器使用释疑

  测试表结构:

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

  和存储过程相关的几个权限:

  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 ;

  5.触发器可以通过UDF调用外部应用程序。

  详细可以参考:http://forge.mysql.com/projects/project.php?id=211

0
相关文章