您的位置:首页 > 数据库 > MySQL

mysql 创建 函数

2015-01-27 14:43 155 查看
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。/article/4274880.html

CREATE
/*[DEFINER = { user | CURRENT_USER }]*/
FUNCTION `test`.`a`()
RETURNS TYPE
/*LANGUAGE SQL
| [NOT] DETERMINISTIC
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
| COMMENT 'string'*/
BEGIN
RETURN ;
END$$
这篇博文的目的就是为了解说这段创建function的语法参数!

/* */这样的注释是类c注释,相信大部分语言里面都有!

[DEFINER = { user | CURRENT_USER }]:定义创建者,可以手动指定数据库中已经存在的用户,或者默认(使用当前用户).

RETURNS TYPE:返回类型,就是mysql里面所支持的所有列类型

[NOT]
DETERMINISTIC:这个是用于binlog和主从复制等!DETERMINISTIC是确定的,意思就是写入binlog的时候,写入的是一个
指定的常量;如unix_timestamp()获取到的值是1,可能写入binlog的时候,unix_timestamp()获取到的时间戳却成了3
了,这个时候会出现数据不一致问题,所以引入了DETERMINISTIC!这是binlog安全的一种机制!一般情况下,NOT
DETERMINISTIC不允许使用,会报如下错误:
Error Code : 1418
This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in
its declaration and binary logging is enabled (you *might* want to use
the less safe log_bin_trust_function_creators variable)
可以从报错内容里面发现,设置log_bin_trust_function_creators函数就可以使用NOT DETERMINISTIC,但是二进制安全性极差!
CONTAINS SQL表示子程序不包含读或写数据的语句;
NO SQL表示子程序不包含SQL语句。
READS SQL DATA表示子程序包含读数据的语句,但不包含写数据的语句。
MODIFIES SQL DATA表示子程序包含写数据的语句。
如果这些特征没有明确给定,默认的是CONTAINS SQL。

SQL SECURITY { DEFINER | INVOKER};就是执行时的权限检查;如果一个函数定义为访问a表中的记录!这个时候就有权限检查。DEFINER就是以创建者的权限去检查,INVOKER是以执行者的权限去检查!
如果用户u1去调用函数f去访问a的记录(此处的DEFINER定义为u2)!当为DEFINER的时候,mysql会检查u1是否有execute函数f的权限,如果有,继续看定义者u2是否有访问a记录的权限;[u1是执行者,u2是定义者]
同理:当为INVOKER的时候,mysql会检查u1是否有execute函数f的权限,如果有,继续看u1是否有访问a记录的权限

COMMENT 'string':注释
具体参考mysql5.1参考手册第20章存储过程和函数!
本文出自 “原下” 博客,请务必保留此出处/article/4274880.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: