本文共 1607 字,大约阅读时间需要 5 分钟。
在还原sql的备份文件时报如下错误:
[Msg] 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)
characteristic参数 | 说明 |
LANGUAGE SQL | 用来说明语句部分是SQL语句,未来可能会支持其它类型的语句。 |
[NOT] DETERMINISTIC | 如果程序或线程总是对同样的输入参数产生同样的结果,则被认为它是“确定的”,否则就是“非确定”的。如果既没有给定DETERMINISTIC也没有给定NOT DETERMINISTIC,默认的就是NOT DETERMINISTIC(非确定的) |
NO SQL | 表示子程序不包含SQL语句。 |
READS SQL DATA | 表示子程序包含读数据的语句,但不包含写数据的语句。 |
MODIFIES SQL DATA | 表示子程序包含写数据的语句。 |
CONTAINS SQL | 表示子程序不包含读或写数据的语句。 |
SQL SECURITY DEFINER | 表示执行存储过程中的程序是由创建该存储过程的用户的权限来执行。 |
SQL SECURITY INVOKER | 表示执行存储过程中的程序是由调用该存储过程的用户的权限来执行。(例如上面的存储过程我写的是由调用该存储过程的用户的权限来执行,当前存储过程是用来查询Employee表,如果我当前执行存储过程的用户没有查询Employee表的权限那么就会返回权限不足的错误,如果换成DEFINER如果存储过程是由ROOT用户创建那么任何一个用户登入调用存储过程都可以执行,因为执行存储过程的权限变成了root) |
COMMENT 'string' | 备注,和创建表的字段备注一样。 |
在编写存储过程和函数时建议明确指定上面characteristic部分的状态,特别是存在复制的环境中,如果创建函数不明确指定这些状态会报错,从一个非复制环境将带函数的数据库迁移到复制环境的机器上如果没有明确指定DETERMINISTIC, NO SQL, or READS SQL DATA该三个状态也会报错。
原来是因为在主从复制的两台MySQL服务器中开启了二进制日志选项log-bin,slave会从master复制数据,而一些操作,比如function所得的结果在master和slave上可能不同,所以存在潜在的安全隐患。因此,在默认情况下会阻止function的创建。
1、临时:在查询窗口运行下列语句:
set global log_bin_trust_function_creators=TRUE;
2、永久:在my.cnf中加入下列语句,并重启Mysql服务
log_bin_trust_function_creators=1
3、明确指明函数的类型
1). DETERMINISTIC 不确定的 2). NO SQL 没有SQl语句,当然也不会修改数据 3). READS SQL DATA 只是读取数据,当然也不会修改数据 比如:CREATE DEFINER=`username`@`%` READS SQL DATA FUNCTION `fn_getitemclock`(i_itemid bigint,i_clock int,i_pos int) RETURNS int(11)... 这样一来相当于明确的告知MySQL服务器这个函数不会修改数据,因此可以在开启了log-bin的服务器上安全的创建并被复制到开启了log-bin的slave上。转载地址:http://lajub.baihongyu.com/