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 (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...