mysql.data.mysqlclient调用存储过程时出错

1wnzp6jl  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(632)

我遇到了一个问题,我相信是在我的特权范围内。然而,我不明白为什么会这样。我在mysql中有一个存储过程,定义如下:

DELIMITER //
CREATE PROCEDURE my_stored_procedure (var_one VARCHAR(20), var_two INT4)
BEGIN 
    UPDATE table_name SET ACTIVATION_DATE = UTC_TIMESTAMP(), 
    DEACTIVATION_DATE = TIMESTAMPADD(MONTH, var_two, UTC_TIMESTAMP()),
    USER_ACTIVATED = 1 WHERE ID = var_one;
END //
DELIMITER ;

我是从我的申请表上打这个电话的。当我使用usera的凭据时,代码运行良好。但是,当我使用userb时,它不起作用。usera被授予以下命令的权限:

GRANT ALL PRIVILEGES ON * . * TO 'userA'@'%';

userb被授予以下命令的权限:

GRANT UPDATE, SELECT ON current_db.table_im_updating TO 'userB'@'%';
GRANT EXECUTE ON PROCEDURE my_stored_procedure TO 'userB'@'%';

我调用mysql存储过程的代码如下:

connection = new MySql.Data.MySqlClient.MySqlConnection("server=ip_address; port=3306; database=data_base; UID=userA; password=password; pooling=false");
MySql.Data.MySqlClient.MySqlCommand command = new MySql.Data.MySqlClient.MySqlCommand();
command.Connection = connection;
command.CommandText = "my_stored_procedure";
command.CommandType = System.Data.CommandType.StoredProcedure;
command.Parameters.AddWithValue("@_id","associated_id");
command.Parameters["@_id"].Direction = System.Data.ParameterDirection.Input;
command.Parameters.AddWithValue("@subscription_length", "6");
command.Parameters["@subscription_length"].Direction = System.Data.ParameterDirection.Input;
command.ExecuteNonQuery();

就像我说的。当输入usera和usera的密码时,该代码工作正常;但当我切换到userb时,错误是,
system.data.sqltypes.sqlnullvalueexception:'数据为空。不能对空值调用此方法或属性。'
另外值得注意的是,如果我将调用过程的方法更改为:

MySql.Data.MySqlClient.MySqlCommand command = new MySql.Data.MySqlClient.MySqlCommand("CALL my_stored_procedure(var_one, var_two)", connection);

我没有错。我不是想让我的代码正常工作,我希望它能正常工作。请帮助我理解是什么导致了这个错误。谢谢。

lymnna71

lymnna711#

给用户b执行sp的权限,并将checkparameters=false添加到连接字符串中

7jmck4yq

7jmck4yq2#

热释光;博士

userb应该被授予 SELECT 访问 mysql.proc table。

解释

首先,执行mysql connnector/net SHOW CREATE PROCEDURE my_stored_procedure 获取所有参数定义(顺序、方向、类型等)
然后,它将结合过程名和参数来创建一个类似sql的 CALL my_stored_procedure(var_one, var_two) 执行。
使用 SHOW CREATE PROCEDURE ,您必须是例程中指定的用户 DEFINER 从句或have SELECT 访问 mysql.proc table。如果您没有例程本身的特权,则 Create Procedure 字段将为空。
--doc:显示创建过程语法
--问题:连接器8.0-mysqldatareader中的存储过程错误

相关问题