如何解决MySQL 8.0角色,存储过程和触发器问题
我们正在创建一个库存数据库系统,可以从两个不同的客户端,一个UI和一个自动化软件(一个机器人)中访问它们。
库存是液体,机器人将在实验中“检出”库存。用户将通过使用UI“签入”广告资源。
机器人将调用存储过程来结帐库存。当执行涉及库存表的插入或更新时,触发器将插入审计记录
为数据库定义了一些用户角色,名为“ lit”,如下所示:
CREATE ROLE 'admin','power','basic','remote';
CREATE DATABASE IF NOT EXISTS lit;
GRANT ALL ON lit.* TO 'admin';
GRANT SELECT,EXECUTE ON lit.* TO 'remote';
像这样创建机器人和管理员用户
CREATE USER IF NOT EXISTS 'lit_remote'@'%' IDENTIFIED BY 'password123';"
GRANT remote to 'lit_remote'@'%';"
CREATE USER IF NOT EXISTS 'lit_admin'@'%' IDENTIFIED BY 'password123';"
GRANT admin to 'lit_admin'@'%';"
在数据库中填充表,存储过程和触发器之前创建用户。
结帐库存存储过程如下:
DELIMITER ;;
CREATE DEFINER=`lit_admin`@`%` PROCEDURE `checkOutProbeInventory`(
IN probeID INT,IN tubeNumber INT,INOUT checkout_volume FLOAT
)
BEGIN
UPDATE probe_tubes
Set volume = volume - checkout_volume
where
probe_id = probe_id and tube_number = tubeNumber;
select volume into checkout_volume
from probe_tubes
where
probe_id = probe_id AND tube_number = tubeNumber;
END ;;
DELIMITER ;
但是,通过上述设置,当lit_remote用户尝试执行存储过程时,我会收到错误消息
SET @vol = -1;
CALL checkOutProbeInventory(66,1,@vol);
错误在于:
Error Code: 1370
execute command denied to user 'lit_admin'@'%' for routine 'lit.checkOutProbeInventory'
lit_admin应该被授予在light DB上的所有权限,所以不明白为什么我会收到此错误。
但是,如果我将DEFINER更改为等于管理员“ role”:
DELIMITER ;;
CREATE DEFINER= `admin`@`%` PROCEDURE `checkOutProbeInventory`(
IN probeID INT,
然后,调用存储过程成功。
在DEFINER中使用“角色”是执行上述操作的推荐方法吗?
一个问题是,当执行TRIGGER作为存储过程的一部分时,如何确定哪个确切的用户调用了存储过程?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。