我遇到了一个问题,我相信是在我的特权范围内。然而,我不明白为什么会这样。我在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);
我没有错。我不是想让我的代码正常工作,我希望它能正常工作。请帮助我理解是什么导致了这个错误。谢谢。
2条答案
按热度按时间lymnna711#
给用户b执行sp的权限,并将checkparameters=false添加到连接字符串中
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
从句或haveSELECT
访问mysql.proc
table。如果您没有例程本身的特权,则Create Procedure
字段将为空。--doc:显示创建过程语法
--问题:连接器8.0-mysqldatareader中的存储过程错误