SET GLOBAL log_bin_trust_function_creators = 1; DELIMITER // CREATE DEFINER=`dbusr`@`%` FUNCTION `calculateMoney`(id VARCHAR(255), companyType VARCHAR(255)) RETURNS DOUBLE BEGIN DECLARE result DOUBLE DEFAULT 0; DECLARE c_borrow_money DOUBLE DEFAULT 0; DECLARE c_back_money DOUBLE DEFAULT 0; END
创建函数时,一直报错mysql 1418,结果是由于DEFINER参数值错误造成,当前用户非dbuser,
删除 DEFINER=`dbusr`@`%`后执行成功
参阅mysql如何修改所有的definer
引用
mysql中的definer是什么,有什么作用?
我们在mysql创建view、trigger、function、procedure、event时都会定义一个Definer=‘xxx’,类似如下:
复制代码
CREATE
ALGORITHM = UNDEFINED
DEFINER = `root`@`%`
SQL SECURITY DEFINER
VIEW `v_ questions` AS
SELECT
`q`.`id` AS `id`,
`q`.`title` AS `title`
FROM
Test q;
或者像这样的:
CREATE DEFINER=`root`@`%` PROCEDURE `user_count`()
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
select count(*) from mysql.user;
END
复制代码
加红的部分SQL SECURITY 其实后面有两个选项,一个为DEFINER,一个为INVOKER
SQL SECURITY { DEFINER | INVOKER } :指明谁有权限来执行。DEFINER 表示按定义者拥有的权限来执行
INVOKER 表示用调用者的权限来执行。默认情况下,系统指定为DEFINER
以存储过程为例:
(1)MySQL存储过程是通过指定SQL SECURITY子句指定执行存储过程的实际用户;
(2)如果SQL SECURITY子句指定为DEFINER,存储过程将使用存储过程的DEFINER执行存储过程,验证调用存储过程的用户是否具有存储过程的execute权限和DEFINER用户是否具有存储过程引用的相关对象的权限;
(3)如果SQL SECURITY子句指定为INVOKER,那么MySQL将使用当前调用存储过程的用户执行此过程,并验证用户是否具有存储过程的execute权限和存储过程引用的相关对象的权限;
(4)如果不显示的指定SQL SECURITY子句,MySQL默认将以DEFINER执行存储过程。
我们来看下面几个小例子。
复制代码
先授权一个:
grant all on testdb.* to 'user1'@'%' identified by '000000' with grant option;
然后我们创建一个存储过程如下:
USE `testdb`;
DROP procedure IF EXISTS `user_count`;
DELIMITER $$
USE `testdb`$$
CREATE DEFINER=`root`@`%` PROCEDURE `user_count`()
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY INVOKER
COMMENT ''
BEGIN
select count(*) from mysql.user;
END$$
DELIMITER ;
复制代码
用root帐号登陆:
复制代码
mysql> use testdb;
Database changed
mysql> call user_count();
+----------+
| count(*) |
+----------+
| 3 |
+----------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
可以正常查询出来。
我们再用user1进行登陆:
mysql> use testdb;
Database changed
mysql> call user_count();
ERROR 1142 (42000): SELECT command denied to user 'user1'@'localhost' for table 'user'
复制代码
发现系统报错查询不到了,这是因为我们在上述定义的SQL SECURITY值为INVOKER,存储过程执行过程中会以user1具有的权限来执行,其中调用到了mysql的库,而我们的user1帐户只有testdb库的使用权限,所以会返回失败。
我们把上面的invoker改为definer再来试一下:
复制代码
update mysql.proc set security_type='DEFINER' where db='testdb' and name='user_count';
再次用user1进行登陆:
mysql> use testdb;
Database changed
mysql> call user_count();
+----------+
| count(*) |
+----------+
| 3 |
+----------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
复制代码
发现可以查询出来了,因为user1对存储过程user_count有执行的权限,虽然它依旧没有权限直接操作mysql库,由于我们定义的SQL SECURITY为DEFINER,所以在执行时是以root的身份执行的,所以可以正常查询出来。
如果方便修改mysql中所有已经定义到的definer?
由于前期在测试库上开发的缘故,我们经常定义到的definer为`root`@`%`,后来搬移到生产库上又得改回来,存在着大量的更新,上百个的视图,函数等一个个改不免太麻烦并且也可能遗漏。如下为总结出的方便修改所有definer的方法,可以直到查漏补缺的作用。
现在在mysql涉及的definer有view、trigger、function、procedure、event。我们一个个作介绍。
1.修改function、procedure的definer
select definer from mysql.proc; -- 函数、存储过程
update mysql.proc set definer='user@localhost'; -- 如果有限定库或其它可以加上where条件
2.修改event的definer
select DEFINER from mysql.EVENT; -- 定时事件
update mysql.EVENT set definer=' user@localhost ';
3.修改view的definer
相比function的修改麻烦点:
select DEFINER from information_schema.VIEWS;
select concat("alter DEFINER=`user`@`localhost` SQL SECURITY DEFINER VIEW ",TABLE_SCHEMA,".",TABLE_NAME," as ",VIEW_DEFINITION,";") from information_schema.VIEWS where DEFINER<>'user@localhost';
查询出来的语句再执行一遍就好了。
4.修改trigger的definer
目前还没有具体方便的方法,可以借助工具端如HeidiSQL、sqlyog等来一个个修改。注意改前有必要锁表,因为如果改的过程中有其它表改变而触发,会造成数据不一致。
Flush tables with readlock
Unlock tables
发表评论
-
linux 安装mysql多个实例
2020-03-13 15:47 421mysql5.7.28多实例 安装mysql,不要启动 创 ... -
mongodb安全验证 密码登录
2020-03-09 16:07 8101、创建用户 cd /d C:\Program Files\ ... -
索引的创建对查询性能影响
2019-08-19 15:14 677索引的正确使用,对查询的性能影响很大 原查询,要2分多 ... -
mysql查询性能优化,650秒优化到0.18秒
2019-08-14 17:57 29开发人员技术水平不一,写出的sql执行性能怎么样,完全靠运气, ... -
MySQL 高可用集群架构 MHA 详解
2018-03-09 09:28 797MySQL 高可用集群架构 MHA ... -
B+tree 索引
2018-03-09 09:11 744mysql和oracle都用到B+tree ... -
怎么查看和修改 MySQL 的最大连接数
2018-03-09 08:47 1116通常,mysql的最大连接数默认是100, 最大可以达到163 ... -
mysql 删除重复记录 保留一条
2018-01-25 10:47 1162-- 方法一 /** 错误码: 1093 You ... -
rsync备份和删除指定文件
2018-01-02 10:23 2044文件异地备份时,需要将本地文件合并到服务器上,且不能删除服务器 ... -
windows mysql定时备份任务
2017-11-03 16:12 996mysqlbak.cmd echo off set tx ... -
windows上oracle11配置监听器
2017-08-23 14:00 1767oracle11 windows版安装后默认通过计算机名 ... -
centos yum 安装mysql
2016-08-11 10:08 522查看这篇文章 http://dev.mysql.com/dow ... -
expdp\impdp及exp\imp
2016-08-03 14:29 748作者写的文章很实用 ht ... -
oracle drop记录
2016-07-21 14:07 1586数据库中缺表了,查一下是什么时候删除的 select * ... -
powerdesigner 16 从数据库生成表结构无响应
2016-07-15 09:35 1320怪事了,powerdesigner从数据库反向生成表结构是,卡 ... -
oracle 删除和重建表空间脚本
2016-07-07 11:23 2601调试数据库生成脚本,需要频繁重建表空间 /** ... -
plsql11 x64 安装和配置 解决OCI: not initialized
2016-06-18 09:38 16892下载了instantclient-basic-windows. ... -
oracle instantclient和plsql配置
2016-05-23 14:47 7341、下载instantclient 下载后多解压到某文件夹下 ... -
oracle AL32UTF8 zhs16gbk 安装字符编码
2016-05-23 14:30 1541NLS_LANG是环境变量,包括3部分NLS参数:NLS_LA ... -
oracle静默安装
2016-05-23 14:29 644oracle11G静默安装过程——linux环境 1.操作 ...
相关推荐
MySQL 常见错误提示及解决方法 MySQL 是一个流行的开源关系数据库管理系统,但是在使用过程中,我们可能会遇到各种各样的错误提示。这些错误提示可能是由于数据库文件格式不正确、文件无法打开、创建表失败、数据库...
Mysql 常见错误提示及解决方法 本文档总结了 Mysql 中常见的错误提示及解决方法,涵盖了文件格式不正确、文件无法打开、创建表失败、数据库已存在、数据库不存在、删除数据库文件失败、读取系统表中的记录失败、...
MySQL 的常见错误解决 MySQL 是一个广泛使用的关系数据库管理系统,但是在使用过程中经常会遇到各种错误,本文将介绍 MySQL 的常见错误解决方案。 一、在进入 MySQL 数据库时出错 在使用 MySQL 客户端连接数据库...
MySQL错误1418是一个常见的问题,特别是在使用存储过程、函数、触发器等数据库对象时。这个错误的主要原因是由于MySQL的二进制日志功能,它用于实现主从复制,确保主服务器和从服务器的数据一致性。当二进制日志开启...
### MySQL常见错误及解决方案 #### 问题1:使用MySQL CommandLine Client,出现闪一下然后窗口就消失的情况,如何解决? 在初次使用MySQL CommandLine Client时,可能会遇到一个常见的问题:客户端窗口短暂显示后...
### MySQL服务无法启动的1067错误解决 在日常使用MySQL的过程中,用户可能会遇到一个常见问题:在尝试启动MySQL服务时出现“错误1067:进程意外中止”的提示。这一问题不仅困扰着初学者,对于有一定经验的开发者来...
MySQL 常见错误及解决方案 MySQL 是一个功能强大且广泛使用的关系型数据库管理系统,但是在使用 MySQL 时,用户经常会遇到一些错误和问题。以下是 MySQL 常见错误及解决方案: 1. 使用 MySQL Command Line Client...
### MySQL常见错误提示及其解决方法 #### 1....以上列举了MySQL中常见的错误代码及其可能的原因与解决办法。针对不同的错误代码,开发者需要采取适当的措施来解决问题,确保数据库系统的稳定运行。
以下是一些常见的MySQL错误及其可能的解决方法: 1. 错误130:这通常意味着文件格式不正确。可能是因为尝试导入的数据文件与MySQL的期望格式不符。解决方案包括检查文件的格式,确保它是MySQL兼容的,例如CSV或SQL...
### MySql 1067错误解决方法 在日常使用MySQL数据库的过程中,我们经常会遇到各种各样的问题,其中“1067错误”是较为常见的一种系统级别的错误提示。本篇文章将详细阐述MySQL 1067错误的具体含义、常见的触发场景...
MySQL 常见错误分析与解决方法总结 MySQL 是一个广泛使用的关系型数据库管理系统,它提供了强大的数据...这些错误都是 MySQL 使用中常见的问题,了解这些错误的原因和解决方法可以帮助我们更好地使用 MySQL 数据库。
### MySQL连接错误解决 在安装MySQL之后,可能会遇到无法连接的问题,其中一种常见的错误提示是“Error 1045 Access denied for user 'root'@'localhost' (using password: YES)”。这个问题通常出现在尝试使用root...
此错误通常意味着你的本地机器无法与MySQL服务器建立连接,原因可能是个人防火墙阻止了必要的TCP端口3306,或者服务尚未启动。 #### 解决方案: 1. **检查防火墙设置**:确保你的个人防火墙已开放TCP端口3306。...
本文将详细讲解如何查询MySQL错误信息以及JavaScript错误信息,并提供相关知识点。 首先,我们来了解一下如何查询MySQL错误信息。MySQL在执行SQL语句时,如果遇到语法错误、权限问题或逻辑错误等,会返回一个错误...
### Navicat连接Mysql报2059错误的原因及解决方法 #### 一、问题背景 在使用Navicat工具连接MySQL数据库时,部分用户可能会遇到错误代码2059的问题,具体表现为:“authentication plugin 'caching_sha2_password'...
### MySQL安装错误代码详解 #### 1016 错误:文件无法打开 当遇到“文件无法打开”...以上是MySQL安装过程中可能遇到的一些常见错误及解决方法。通过合理地诊断和解决问题,可以有效地提高MySQL数据库的稳定性和性能。