mysql 存储过程

关于MySQL存储过程,视图,事件

查询修改存储过程

select `name` from mysql.proc where `type` = 'PROCEDURE';
select `name` from mysql.proc where `type` = 'FUNCTION';

select definer from mysql.proc where definer like '%demo%';
select DEFINER from mysql.EVENTS;
select DEFINER from information_schema.VIEWS;   
select DEFINER from information_schema.TRIGGERS;

SHOW CREATE PROCEDURE Proo_Bm_CreateMessageData;

手动执行存储过程

mysql> DROP PROCEDURE IF EXISTS `Proo_Bm_CreateMessageData`;
......
mysql> grant all privileges on *.* to root@"%" identified by ".";
Query OK, 0 rows affected (0.01 sec)

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

mysql> delimiter //
mysql> CREATE DEFINER=`root`@`%` PROCEDURE `Prou_Bm_PlanStatusChange`()
BEGIN-- 声明变量
	DECLARE
		row_id BIGINT ( 20 );
		...
		...
		...
END;
//
Query OK, 0 rows affected (0.00 sec)

mysql> 

注意

关于delimiter MySQL默认结束是分号;但是,delimiter 可以自定义结束符号。例如:

DELIMITER $$ --先定义结束符

​ DROP TRIGGER IF EXISTS triggername $$

​ CREATE TRIGGER triggername AFTER DELETE ON id

​ FOR EACH ROW BEGIN

​ …
​ END; – 遇到;mysql解释器不再执行

− − 遇 到 -- 遇到 开始执行

DELIMITER ; – 还原结束符

存储过程的导入导出

导出:

mysqldump -u 数据库用户名 -p -n -t -d -R --triggers=false 数据库名 > 文件名

-d 表示–no-create-db,

-n表示–no-data

-t表示–no-create-info,

-R表示导出function和procedure

–triggers=false

-ntd 是表示导出存储过程

-R是表示导出函数

导入:

mysqldump -uroot -p -ntd -R demo > sql.sql
mysqldump -h127.0.0.1 -uroot -p -ntd -R --triggers=false demo > demo.sql

导入前,确认sql文件中 definer !!! 导入时所用账号 并不具有 SUPER 权限,所以无法创建 其他账号 的所属对象。
如果需要修改definer为新的库名
利用vi命令全局替换
:1,$ s/oldDBName/newDBName/g

mysql -h127.0.0.1 -uroot -p demo < demo.sql

The user specified as a definer (‘root’@’%’) does not exist(没有权限)

  1. 先看下mysql是否设置了环境变量,如果没设置,就需要切换到mysql的bin目录下执行命令(我的已经设置过了)
mysql -hlocalhost -uroot -p123456
  1. 给root用户添加权限
grant all privileges on *.* to root@"%" identified by ".";
  1. 刷新权限
flush privileges;

附加:

MySQL 中一个很特别的权限控制机制,像视图、函数、存储过程、触发器等这些数据对象会存在一个 DEFINER 和一个 SQL SECURITY 的属性,如下所示:

--视图定义
CREATE ALGORITHM = UNDEFINED DEFINER = `root`@`%` SQL SECURITY DEFINER VIEW v_test

--函数定义
CREATE DEFINER=`root`@`%` FUNCTION `f_test()` RETURNS varchar(100) SQL SECURITY DEFINER

--存储过程定义
CREATE DEFINER=`root`@`%` PROCEDURE `p_test`() SQL SECURITY DEFINER

--触发器定义
CREATE DEFINER=`root`@`%` trigger t_test 

--事件定义
CREATE DEFINER=`root`@`%` EVENT `e_test`
1234567891011121314
  • DEFINER:对象定义者,在创建对象时可以手动指定用户,不指定的话默认为当前连接用户;
  • SQL SECURITY:指明以谁的权限来执行该对象,有两个选项,一个为DEFINER,一个为INVOKER,默认情况下系统指定为 DEFINER;
    • DEFINER:表示按 定义者 的权限来执行;
    • INVOKER:表示按 调用者 的权限来执行。

如果导入账号具有 SUPER 权限,即使对象的所有者账号不存在,也可以导入成功,但是在查询对象时,如果对象的 SQL SECURITYDEFINER,则会报账号不存在的报错。

ERROR 1449 (HY000): The user specified as a definer (‘root’@’%’) does not exist

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值