mysql stored routine (存储例程) 中 definer 的作用 和实例

创建 例程语法参见https://dev.mysql.com/doc/refman/5.7/en/create-procedure.html

创建procedure 的语法如下

CREATE
    [DEFINER = { user | CURRENT_USER }]
    PROCEDURE sp_name ([proc_parameter[,...]])
    [characteristic ...] routine_body
definer 的作用是进行一个权限的控制 只有super 权限或者 指定的 procedure 创建者 才能执行这个procedure
只有super 用户才能使用definer 语法

创建一个简单的实例 我是在[email protected] 下面创建的

mysql> delimiter #

mysql> CREATE DEFINER=`hee`@`localhost` PROCEDURE `simpleproc`(OUT param1 INT)
    begin select count(*) INTO param1 from `categories`;
end #
mysql> delimiter ;

#调用的时候直接

mysql> call simpleproc(@a);
mysql> select @a;
+------+
| @a   |
+------+
|    6 |
+------+
1 row in set (0.00 sec)

现在我切换到 [email protected]

本应该 我执行 simpleproc 就可以的 因为当前用户就是[email protected] 但是仍然失败 代码如下

#我先创建了 [email protected] 用户 【在[email protected] 下面 创建】
mysql> create user [email protected] identified by "abc";

#在给了一部分权限给[email protected]
grant insert,update,select on `api_db`.`categories` to [email protected];

# 为什么我没有直接给ALL PRIVILEGES 给 [email protected] 是因为 不是所有的情况都可以给all privileges 的 我旨在说明 执行 procedure 的权限

# 切换到 [email protected]

mysql> call simpleproc(@a);
ERROR 1370 (42000): execute command denied to user ‘hee‘@‘localhost‘ for routine ‘api_db.simpleproc‘
mysql> select CURRENT_USER;
+---------------+
| CURRENT_USER  |
+---------------+
| [email protected] |
+---------------+
1 row in set (0.00 sec)

为啥不能执行simpleproc ?

因为在还需要另外的权限

参考 grant 权限列表 https://dev.mysql.com/doc/refman/8.0/en/privileges-provided.html#priv_execute

摘抄

The EXECUTE privilege is required to execute stored routines (procedures and functions). 要执行 procedure 必须拥有execute 权限 这个可以再 mysql.user 表格中查看

EXECUTE 是加载在一个database 上面的 所以 要授权使用

mysql> grant EXECUTE on `api_db`.* to [email protected];
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

但是 还是在另外一个终端 ([email protected] 登陆的终端) 还是执行 call simpleproc(@a) 失败 只要重新登录mysql一下就可以了

mysql> call simpleproc1(@a) ;
Query OK, 1 row affected (0.00 sec)

mysql> select @a
    -> ;
+------+
| @a   |
+------+
|    1 |
+------+
1 row in set (0.00 sec)
时间: 2024-07-31 13:30:50

mysql stored routine (存储例程) 中 definer 的作用 和实例的相关文章

MySQL数据库InnoDB存储引擎中的锁机制

MySQL数据库InnoDB存储引擎中的锁机制    http://www.uml.org.cn/sjjm/201205302.asp   00 – 基本概念 当并发事务同时访问一个资源的时候,有可能导致数据不一致.因此需要一种致机制来将访问顺序化. 锁就是其中的一种机制.我们用商场的试衣间来做一个比喻.试衣间供许多消费者使用.因此可能有多个消费者同时要试衣服.为了避免冲突,试衣间的门上装了锁.试衣服的人在里边锁住,其他人就不能从外边打开了.只有里边的人开门出来,外边的人才能进去. - 锁的基本

MySQL 温故而知新--Innodb存储引擎中的锁

近期碰到非常多锁问题.所以攻克了后,细致再去阅读了关于锁的书籍,整理例如以下:1,锁的种类 Innodb存储引擎实现了例如以下2种标准的行级锁: ? 共享锁(S lock),同意事务读取一行数据. ?  排它锁(X lock).同意事务删除或者更新一行数据. 当一个事务获取了行r的共享锁.那么另外一个事务也能够马上获取行r的共享锁,由于读取并未改变行r的数据.这样的情况就是锁兼容. 可是假设有事务想获得行r的排它锁,则它必须等待事务释放行r上的共享锁-这样的情况就是锁不兼容.二者兼容性例如以下表

MySQL数据库InnoDB存储引擎中的锁机制--转载

原文地址:http://www.uml.org.cn/sjjm/201205302.asp 00 – 基本概念 当并发事务同时访问一个资源的时候,有可能导致数据不一致.因此需要一种致机制来将访问顺序化. 锁就是其中的一种机制.我们用商场的试衣间来做一个比喻.试衣间供许多消费者使用.因此可能有多个消费者同时要试衣服.为了避免冲突,试衣间的门上装了锁.试衣服的人在里边锁住,其他人就不能从外边打开了.只有里边的人开门出来,外边的人才能进去. - 锁的基本类型 数据库上的操作可以归纳为两中,读和写.多个

mysql 存储过程和存储函数

14.1.1 创建存储过程 MySQL中,创建存储过程的基本形式如下: CREATE PROCEDURE sp_name ([proc_parameter[,...]]) [characteristic ...] routine_body 其中,sp_name参数是存储过程的名称:proc_parameter表示存储过程的参数列表: characteristic参数指定存储过程的特性:routine_body参数是SQL代码的内容,可以用BEGIN…END来标志SQL代码的开始和结束. proc

存储例程

存储例程 存储例程是存储程序的一种类型,本质上也是封装了一些可执行的语句,只不过它的调用方式是:需要手动去调用!存储例程又可以分为存储函数和存储过程. 存储函数 创建存储函数 存储函数其实就是一种函数,只不过在这个函数里可以执行命令语句而已.函数它可以把处理某个问题的过程封装起来,之后直接调用函数就可以去解决同样的问题了.MySQL 中定义存储函数的语句如下: CREATE FUNCTION 存储函数名称([参数列表]) RETURNS 返回值类型 BEGIN 函数体内容 END 从这里可以看出

Mysql更换MyISAM存储引擎为Innodb的操作记录

一般情况下,mysql会默认提供多种存储引擎,可以通过下面的查看: 1)查看mysql是否安装了innodb插件.通过下面的命令结果可知,已经安装了innodb插件. mysql> show plugins; +------------+--------+----------------+---------+---------+ | Name | Status | Type | Library | License | +------------+--------+----------------

mysql 流程函数 存储引擎 InnoDB简单特性

建表及插入数据语句: mysql> create table salary(userid int,salary decimal(9,2)); Query OK, 0 rows affected (0.11 sec) mysql> insert into salary values(1,1000),(2,2000),(3,3000),(4,4000),(5,5000),(1, null); Query OK, 6 rows affected (0.13 sec) Records: 6  Dupl

MySQL的多存储引擎架构

支持多种存储引擎是众所周知的MySQL特性,也是MySQL架构的关键优势之一.如果能够理解MySQL Server与存储引擎之间是怎样通过API交互的,将大大有利于理解MySQL的核心基础架构.本文将首先介绍MySQL的整体逻辑架构,然后分析MySQL的存储引擎API并介绍如何编写自己的MySQL存储引擎. MySQL逻辑架构 MySQL作为一个大型的网络程序.数据管理系统,架构非常复杂.下图大致画出了其逻辑架构. Connectors MySQL首先是一个网络程序,其在TCP之上定义了自己的应

Navicat: Can't create a procedure from within another stored routine

测试调用mysql的存储过程,于是用Navicat写,结果报这个错误,源代码如下: CREATE PROCEDUREQueryDate() BEGIN SELECTCURDATE(); END; google了下,原来在Navicat里面不需要写头,直接从BEGIN开始即可. 过程名将在保存的时候填写,参数则可以填在代码定义框下面的参数输入框中,如果要使用返回值,则可以设定类型为FUNCTION,回传框即可填写. Navicat: Can't create a procedure from wi