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章存储过程和函数!