mysql 创建执行函数(1418,1419错误,root可以看到函数内容,普通用户看不到,问题解决)

测试所用mysql版本:5.7.28

当我创建的mysql函数过程中,业务逻辑肯定存在sql时,执行函数写完了,

CREATE DEFINER = `root`@`1.14.30.49` FUNCTION `NewProc`() RETURNS int(11)
BEGIN
	-- =============================================
	-- Author: water
	-- Create date: <20190310>
	-- Description: 图片比对记录表关联查询数据迁移到总表
	-- Modify [n]: < 20190310 >
	-- =============================================
	#函数执行内容

	DECLARE executeTotal INTEGER(10); #执行条数
	DECLARE oldTotal INTEGER(10); #执行前条数
	DECLARE newTotal INTEGER(10); #执行后条数
	SELECT COUNT(id) INTO executeTotal FROM picture_comparison WHERE create_time < data_before;
	SELECT COUNT(id) INTO oldTotal FROM picture_comparison_sum;
	#1、批量插入结果集
	INSERT INTO picture_comparison_sum (id,student_name, student_id, tel, college_name, major_name, training_name, video_name, picture_type, registr_image_url, capture_image_url, comparison_result,confidence, create_time) 
	SELECT 
		p.id, s.studentName, s.studentId, s.tel, c.collegeName, m. NAME AS majorName, t.trainingName, v.videoName, p.type as picture_type, p.registr_image_url, p.capture_image_url, p.is_success as comparison_result, p.confidence, DATE_FORMAT( p.create_time, '%Y-%m-%d %H:%i:%s' ) AS create_time
	FROM picture_comparison p LEFT JOIN student s ON p.user_id = s.studentId LEFT JOIN college_management c ON s.institute = c.id LEFT JOIN major m ON s.major = m.id LEFT JOIN training_class t ON s.clazz = t.id LEFT JOIN video v ON v.videoId = p.videoId 
	WHERE p.create_time < data_before ORDER BY p.create_time;

	SELECT COUNT(id) INTO newTotal FROM picture_comparison_sum;
	#2、批量删除表数据
	IF executeTotal = newTotal - oldTotal THEN
		DELETE FROM picture_comparison WHERE create_time < data_before;
	END IF;
	RETURN executeTotal;
END;

这时遇到了第一个错误:1418错误,mysql开启了bin-log, 我们就必须指定我们的函数是否是哪种类型(两种方法:【1、关闭bin-log;2、指定函数类型】)可以参考:MySQL 错误1418 的原因分析及解决方法

之后创建发现1419错误,(可能是当前用户没有创建函数的权限吧)可以参考:MySQL创建触发器的时候报1419错误( 1419 - You do not have the SUPER privilege and binary logging is enabled )

当然我这里采用了另一种解决方法,直接使用了root账户创建了函数,创建后root可以看到函数内容,普通用户看不到,原因是函数的定义者需要修改:可以参考:记一次mysql神奇现象--root可以看到函数内容,普通用户看不到?

最终结果:

CREATE DEFINER = `sjt_user1`@`%` FUNCTION `NewProc`()
 RETURNS int(11)
    DETERMINISTIC
BEGIN
	-- =============================================
	-- Author: water
	-- Create date: <20190310>
	-- Description: 图片比对记录表关联查询数据迁移到总表
	-- Modify [n]: < 20190310 >
	-- =============================================
	#函数执行内容

	DECLARE executeTotal INTEGER(10); #执行条数
	DECLARE oldTotal INTEGER(10); #执行前条数
	DECLARE newTotal INTEGER(10); #执行后条数
	SELECT COUNT(id) INTO executeTotal FROM picture_comparison WHERE create_time < data_before;
	SELECT COUNT(id) INTO oldTotal FROM picture_comparison_sum;
	#1、批量插入结果集
	INSERT INTO picture_comparison_sum (id,student_name, student_id, tel, college_name, major_name, training_name, video_name, picture_type, registr_image_url, capture_image_url, comparison_result,confidence, create_time) 
	SELECT 
		p.id, s.studentName, s.studentId, s.tel, c.collegeName, m. NAME AS majorName, t.trainingName, v.videoName, p.type as picture_type, p.registr_image_url, p.capture_image_url, p.is_success as comparison_result, p.confidence, DATE_FORMAT( p.create_time, '%Y-%m-%d %H:%i:%s' ) AS create_time
	FROM picture_comparison p LEFT JOIN student s ON p.user_id = s.studentId LEFT JOIN college_management c ON s.institute = c.id LEFT JOIN major m ON s.major = m.id LEFT JOIN training_class t ON s.clazz = t.id LEFT JOIN video v ON v.videoId = p.videoId 
	WHERE p.create_time < data_before ORDER BY p.create_time;

	SELECT COUNT(id) INTO newTotal FROM picture_comparison_sum;
	#2、批量删除表数据
	IF executeTotal = newTotal - oldTotal THEN
		DELETE FROM picture_comparison WHERE create_time < data_before;
	END IF;
	RETURN executeTotal;
END;

编写时所引用和借鉴的url

MySQL 错误1418 的原因分析及解决方法

MySQL创建触发器的时候报1419错误( 1419 - You do not have the SUPER privilege and binary logging is enabled )

记一次mysql神奇现象--root可以看到函数内容,普通用户看不到?

猜你喜欢

转载自blog.csdn.net/huqiwuhuiju/article/details/115511116