mysql — C# заставляет пользователя не выходить из исключения в транзакции

#c# #mysql #transactions

#c# #mysql #операции

Вопрос:

Я запускаю транзакцию MySQL на C#, и мне не удалось выполнить второй запрос. Я получаю освобождение в следующей строке:

int no = sql_loc.ExecuteNonQuery();

 db_local = "SERVER=localhost; Database=sync_r; UID=kandy; Password=kandy500;allow user variables=true";  MySqlConnection con_local = new MySqlConnection(db_local); con_local.Open();  delq = "delete from tbl_recipes"; // all records query = "insert into tbl_recipes(cat_id) values(6)";  MySqlTransaction tran = con_local.BeginTransaction(); MySqlCommand sql_loc = con_local.CreateCommand(); sql_loc.Transaction = tran;  sql_loc.CommandText = delq; sql_loc.ExecuteNonQuery(); sql_loc.CommandText = query; int no = sql_loc.ExecuteNonQuery(); if (no == 1)  sql_loc.Transaction.Commit(); else  sql_loc.Transaction.Rollback();  

ошибка, вызванная ниже

 {"The user specified as a definer ('root'@'%') does not exist"}  

но это не тот пользователь, которого я указал. Как я могу это исправить?? Где может быть реальная проблема?

Комментарии:

1. Проверьте пользователя в базе данных

2. Есть ли у tbl_recipes таблицы триггер? Вы можете запустить SHOW TRIGGERS в клиенте mysql. Я ожидаю, что триггер был определен, root@% но этот пользователь больше не существует в вашем экземпляре. Или, возможно tbl_recipes , это представление, и у представлений также есть определитель.

3. @BillKarwin да, был триггер, и это было причиной. Большое спасибо

Ответ №1:

Как обсуждалось в комментариях выше, ошибка возникает из-за триггера, который пытается принять идентификатор своего определителя при выполнении, но определитель («root»@»%») больше не существует в экземпляре MySQL.

Обходной путь заключается в создании этого пользователя (даже если вы создадите его, а затем отключите аутентификацию).

Мы делаем это на моем рабочем месте. Мы определяем триггеры, хранимые процедуры и представления с помощью специального пользователя с СУПЕР привилегиями, хотя мы никогда не используем этого пользователя для доступа к базе данных. Мы создаем других пользователей MySQL для приложений и отдельных разработчиков, но не предоставляем этим пользователям СУПЕР привилегии.