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
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
相关文章推荐
- 解决mysql不能创建函数
- MySql创建函数
- mysql-创建函数,存储过程以及视图
- 解决mysql不能创建函数
- MySql 创建函数 Error Code : 1418
- Mysql创建函数出错
- Mysql创建函数出错的解决
- mysql创建自定义函数和存储过程
- mysql导入ERROR 1418(HY000)错误--创建函数错误
- mysql创建自定义函数
- mysql创建功能函数格式化时间
- [轉]MySql创建函数问题
- mysql 创建函数时出现 Error Code : 1418 错误解决办法
- Mysql创建自定义函数
- mysql创建函数问题
- Mysql Query Browser下创建存储过程和自定义函数
- mysql 创建函数的1418错误解决方案
- mysql 创建函数时出现 Error Code : 1418 错误解决办法
- 深入mysql创建自定义函数与存储过程的详解
- mysql开启创建函数的功能