DEFINER作用

本文详细解释了MySQL中definer参数在视图、触发器、存储过程和存储函数中的作用,以及SQLSECURITY的不同设置(DEFINER和INVOKER)如何影响调用权限。通过实例说明了DEFINER参数如何限制调用者权限,以及SQLSECURITY=INVOKER下的权限规则。
摘要由CSDN通过智能技术生成

MySQL的视图、触发器、存储过程、存储函数定义中都会涉及definer参数及配套的SQL SECURITY

如存储过程定义:

CREATE [DEFINER = user] PROCEDURE [IF NOT EXISTS] sp_name ([proc_parameter[,...]])

    SQL SECURITY { DEFINER | INVOKER }

BEGIN

    <执行部分>

END;

一.作用及意义

DEFINER参数是用来限制调用者权限,默认SQL SECURITY 的值为 DEFINER,即表示调用者若想 CALL 此对象,必须DEFINER用户具备该对象的调用权限。SQL SECURITY 的值为 INVOKER时,DEFINER参数失效。

例如:存储过程proc_1涉及查询A、B两张表,定义者对A有查询权限,对B不存在查询权限,此时定义者将无法调用proc_1,其他具备A/B表查询权限的人,也无法调用proc_1。

二、示例说明SQL SECURITY DEFINER

调用者能成功调用存储过程的前提条件是:

1.本身具备调用该对象的权限;

2.该对象的定义者具有该对象的调用权限;

3.该对象的定义者具有访问该对象涉及的其他对象权限),如查询了其他表;

2.1 示例1:

库test

用户:root,DBA权限

用户:TEST01,仅具有test库的查询权限

用户:TEST02,仅具有test库的存储执行权限

-- root创建两个分别定义者为TEST01和TEST02的存储过程

DELIMITER &&

CREATE DEFINER=TEST01 PROCEDURE test.proc_1()

BEGIN

select * from test.EMPLOYEE;

END &&



DELIMITER &&

CREATE DEFINER=TEST02 PROCEDURE test.proc_2()

BEGIN

select * from test.EMPLOYEE;

END &&

结论:三用户无法调用这两个存储过程。

验证:给用户TEST02增加test.EMPLOYEE表的查询权限,则root、TEST02均可调用proc_2

GRANT SELECT on test.* TO TEST02;

三、示例说明SQL SECURITY INVOKER

调用者能成功调用存储过程的前提条件是:

1.本身具备调用该对象的权限;

2.本身具有访问该对象涉及的其他对象权限),如查询了其他表;

2.1 示例1

库test

用户:root,DBA权限

用户:TEST01,仅具有test库的查询权限

用户:TEST02,仅具有test库的存储执行权限

DELIMITER &&

CREATE DEFINER=TEST01 PROCEDURE test.proc_3()

SQL SECURITY INVOKER

BEGIN

select * from test.EMPLOYEE;

END &&



DELIMITER &&

CREATE DEFINER=TEST02 PROCEDURE test.proc_4()

SQL SECURITY INVOKER

BEGIN

select * from test.EMPLOYEE;

END &&

结论:只有root用户可以调用两个存储过程。

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值