mysql创建function_mysql 创建函数(function)参数解说

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值