需求
在Amazon RDS Mysql兼容数据库创建自定义函数
现象
执行创建命令时,出现了如下几个报错
问题一
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
问题二
ERROR 1046 (3D000): No database selected
问题三
ERROR 1419 (HY000): You do not have the SUPER privilege and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)
解决方法
问题一
报错 1064 42000 是指 SQL 语法错误,可能是由于示例代码中的语法不正确或数据库类型不匹配导致的。对于MySQL函数,您需要在创建函数之前将DELIMITER设置为自定义的分隔符,以避免在函数体中使用的分号(;)与外部的分号冲突。创建函数后,再将分隔符恢复为默认的分号。
问题二
这个报错是因为在创建函数时没有选择数据库。在 MySQL 中,您必须在创建函数之前明确指定要在哪个数据库中创建该函数。报错信息 "No database selected" 意味着您在执行创建函数的命令之前没有选择要创建函数的数据库。
问题三
该错误提示表明您没有 SUPER 权限,并且二进制日志记录(binary logging)是启用的。在启用二进制日志记录的情况下,要创建带有非确定性结果的函数(例如自增函数),需要 SUPER 权限。解决方法:SET GLOBAL log_bin_trust_function_creators = 1;
执行流程
`## 查看当前RDS参数
mysql> SHOW VARIABLES LIKE ‘log_bin_trust_function_creators’;
±--------------------------------±------+
| Variable_name | Value |
±--------------------------------±------+
| log_bin_trust_function_creators | OFF |
±--------------------------------±------+
查看并修改RDS参数组参数值为1,再次查看RDS参数
mysql> SHOW VARIABLES LIKE ‘log_bin_trust_function_creators’;
±--------------------------------±------+
| Variable_name | Value |
±--------------------------------±------+
| log_bin_trust_function_creators | ON |
±--------------------------------±------+
切换数据库,执行创建自定义函数命令
Database changed
mysql> DELIMITER //
mysql> CREATE FUNCTION DecryptData(encryptedData VARCHAR(3000))
-> RETURNS VARCHAR(1024)
-> READS SQL DATA
-> BEGIN
-> <函数体>
-> END //
Query OK, 0 rows affected (0.02 sec)
mysql> DELIMITER ;
mysql> drop database op_test;
Query OK, 0 rows affected (0.01 sec)
- PS :Amazon RDS 需要修改参数组,动态参数直接生效,静态参数则需要重启实例。更换参数组也需要重启实例。