Я сталкиваюсь с проблемой, которая, как я полагаю, лежит в моих привилегиях. Однако я не могу понять, почему это происходит. У меня есть хранимая процедура в 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, он не работает. Пользователю были предоставлены привилегии с помощью команды:
GRANT ALL PRIVILEGES ON * . * TO 'userA'@'%';
Пользователю были предоставлены привилегии с этими командами:
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: "Данные являются нулевыми. Этот метод или свойство не может быть вызван значениями Null. '
Также стоит отметить, что если я изменю свой метод вызова процедуры на это:
MySql.Data.MySqlClient.MySqlCommand command = new MySql.Data.MySqlClient.MySqlCommand("CALL my_stored_procedure(var_one, var_two)", connection);
У меня нет ошибок. Я не пытаюсь просто заставить мой код работать, я хочу, чтобы он работал правильно. Пожалуйста, помогите мне понять, что вызывает эту ошибку. Благодарю.
userB должен быть предоставлен с помощью доступа SELECT
к таблице mysql.proc
.
Во-первых, MySQL Connnector/NET выполняется SHOW CREATE PROCEDURE my_stored_procedure
для определения всех параметров. (Заказ, Направление, DbType и т.д.)
Затем он объединит имя и параметры процедуры для создания sql, например CALL my_stored_procedure(var_one, var_two)
для выполнения.
Чтобы использовать
SHOW CREATE PROCEDURE
DEFINER
, вы должны быть именованным пользователем в подпрограммеDEFINER
или иметь доступSELECT
к таблицеmysql.proc
. Если у вас нет прав для самой процедуры, значение, отображаемое для поля "Create Procedure
будет NULL.- Doc: ПОКАЖИТЕ ПРОЦЕДУРА СОЗДАНИЯ Синтаксис
- Проблема: Connector 8.0 - Ошибка хранимой процедуры в MySqlDataReader
Дайте пользователю B привилегии на выполнение SP и добавьте CheckParameters = false в строку подключения
MySqlConnection
иMySqlCommand
являютсяIDisposable
поэтому каждый должен быть в блокеusing
.Input
является направлением по умолчанию, поэтому вам не нужно указывать это. Кроме того, вы можете посмотреть, можем ли мы прекратить использовать AddWithValue .