protected void OnButtonDeleteClicked(object sender, EventArgs e) { TreeIter iter; treeviewUsers.Selection.GetSelected(out iter); int itemid = (int)UsersListStore.GetValue(iter, 0); string loginname = UsersListStore.GetValue(iter, 1).ToString(); bool result; if (QSMain.IsOrmDeletionConfigered) { result = QSMain.OnOrmDeletion("users", itemid); } else { Delete winDel = new Delete(); result = winDel.RunDeletion("users", itemid); winDel.Destroy(); } if (result) { if (QSSaaS.Session.IsSaasConnection) { logger.Info("Удаляем пользователя в облаке..."); QSSaaS.ISaaSService svc = QSSaaS.Session.GetSaaSService(); if (!svc.changeBaseAccessFromProgram(QSSaaS.Session.SessionId, loginname, QSSaaS.Session.SaasBaseName, false)) { logger.Error("Ошибка удаления доступа к базе на сервере SaaS."); } if (svc.UserAccessBaseCount(QSSaaS.Session.SessionId, QSSaaS.Session.Account, loginname) == 0) { if (MessageDialogWorks.RunQuestionDialog($"У пользователя '{loginname}' на сервисе QS:Облако больше не осталось баз данных, к которым он имеет доступ. Удалить пользователя с QS:Облако тоже?")) { if (!svc.DeleteCloudUser(QSSaaS.Session.SessionId, QSSaaS.Session.Account, loginname)) { var text = "Удаления пользователя с QS:Облако не произошло."; logger.Error(text); MessageDialogWorks.RunErrorDialog(text); } } } } else { logger.Info("Удаляем пользователя MySQL..."); string sql; sql = "DROP USER @login, @login @'localhost'"; try { QSMain.CheckConnectionAlive(); MySqlCommand cmd = new MySqlCommand(sql, QSMain.connectionDB); cmd.Parameters.AddWithValue("@login", loginname); cmd.ExecuteNonQuery(); logger.Info("Пользователь удалён. Ok"); if (QSMain.User.Id == itemid) { MessageDialog md = new MessageDialog(this, DialogFlags.DestroyWithParent, MessageType.Warning, ButtonsType.Close, "Был удален пользователь, под которым Вы подключились к базе данных, чтобы недопустить некорректных операций программа закроется. Зайдите в программу от имени другого пользователя."); md.Run(); md.Destroy(); Environment.Exit(0); } } catch (Exception ex) { logger.Error(ex, "Ошибка удаления пользователя!"); QSMain.ErrorMessage(this, ex); } } } UpdateUsers(); }
void UpdatePrivileges() { logger.Info("Устанавливаем права..."); try { string privileges; if (checkAdmin.Active) { privileges = "ALL"; } else { privileges = "SELECT, INSERT, UPDATE, DELETE, EXECUTE, SHOW VIEW"; } string sql = $"GRANT {privileges} ON `{QSMain.connectionDB.Database}`.* TO @login, @login @'localhost'"; QSMain.CheckConnectionAlive(); MySqlCommand cmd = new MySqlCommand(sql, QSMain.connectionDB); cmd.Parameters.AddWithValue("@login", entryLogin.Text); cmd.ExecuteNonQuery(); if (checkAdmin.Active) { cmd.CommandText = "GRANT CREATE USER, GRANT OPTION ON *.* TO @login, @login @'localhost'"; } else { cmd.CommandText = "REVOKE CREATE USER, GRANT OPTION ON *.* FROM @login, @login @'localhost'"; } cmd.ExecuteNonQuery(); bool GrantMake = false; if (checkAdmin.Active) { sql = "GRANT SELECT, UPDATE ON mysql.* TO @login, @login @'localhost'"; GrantMake = true; } else { sql = "SHOW GRANTS FOR @login"; cmd = new MySqlCommand(sql, QSMain.connectionDB); cmd.Parameters.AddWithValue("@login", entryLogin.Text); using (MySqlDataReader rdr = cmd.ExecuteReader()) { while (rdr.Read()) { if (rdr[0].ToString().IndexOf("mysql") > 0) { GrantMake = true; } } } sql = "REVOKE SELECT, UPDATE ON mysql.* FROM @login, @login @'localhost'"; } if (GrantMake) { cmd = new MySqlCommand(sql, QSMain.connectionDB); cmd.Parameters.AddWithValue("@login", entryLogin.Text); cmd.ExecuteNonQuery(); } logger.Info("Права установлены. Ok"); } catch (MySqlException ex) when(ex.Number == 1044) { logger.Error(ex, "Ошибка установки прав!"); MessageDialogWorks.RunErrorDialog("У вас не достаточно прав на сервере MySQL для установки полномочий другим пользователям. Возможно некоторые права не были установлены."); } catch (Exception ex) { logger.Error(ex, "Ошибка установки прав!"); QSMain.ErrorMessage(this, ex); } }
public static void RunCreation(CreationScript script, string server, string dbname, string login, string password) { if (script == null) { script = Scripts.First(); } string connStr, host; uint port = 3306; string[] uriSplit = server.Split(new char[] { ':' }, 2, StringSplitOptions.RemoveEmptyEntries); host = uriSplit [0]; if (uriSplit.Length > 1) { uint.TryParse(uriSplit [1], out port); } var conStrBuilder = new MySqlConnectionStringBuilder(); conStrBuilder.Server = host; conStrBuilder.Port = port; conStrBuilder.UserID = login; conStrBuilder.Password = password; connStr = conStrBuilder.GetConnectionString(true); var connectionDB = new MySqlConnection(connStr); try { logger.Info("Connecting to MySQL..."); connectionDB.Open(); } catch (MySqlException ex) { logger.Info("Строка соединения: {0}", connStr); logger.Error(ex, "Ошибка подключения к серверу."); if (ex.Number == 1045 || ex.Number == 0) { MessageDialogWorks.RunErrorDialog("Доступ запрещен.\nПроверьте логин и пароль."); } else if (ex.Number == 1042) { MessageDialogWorks.RunErrorDialog("Не удалось подключиться к серверу БД."); } else { MessageDialogWorks.RunErrorDialog("Ошибка соединения с базой данных."); } connectionDB.Close(); return; } logger.Info("Проверяем существует ли уже база."); var sql = "SHOW DATABASES;"; var cmd = new MySqlCommand(sql, connectionDB); bool needDropBase = false; using (var rdr = cmd.ExecuteReader()) { while (rdr.Read()) { if (rdr [0].ToString() == dbname) { if (MessageDialogWorks.RunQuestionDialog("База с именем `{0}` уже существует на сервере. Удалить существующую базу перед соданием новой?", dbname)) { needDropBase = true; break; } else { return; } } } } logger.Info("Создаем новую базу."); progressDlg = new CreatorProgress(); progressDlg.OperationText = "Получаем скрипт создания базы"; progressDlg.Show(); string sqlScript; using (Stream stream = System.Reflection.Assembly.GetEntryAssembly().GetManifestResourceStream(script.Resource)) { if (stream == null) { throw new InvalidOperationException(String.Format("Ресурс {0} со скриптом не найден.", script.Resource)); } StreamReader reader = new StreamReader(stream); sqlScript = reader.ReadToEnd(); } int predictedCount = Regex.Matches(sqlScript, ";").Count; logger.Debug("Предполагаем наличие {0} команд в скрипте.", predictedCount); progressDlg.OperationText = String.Format("Создаем базу <{0}>", dbname); progressDlg.OperationPartCount = predictedCount + (needDropBase ? 2 : 1); progressDlg.OperationCurPart = 0; if (needDropBase) { logger.Info("Удаляем существующую базу {0}.", dbname); progressDlg.OperationText = String.Format("Удаляем существующую базу {0}", dbname); cmd.CommandText = String.Format("DROP DATABASE `{0}`", dbname); cmd.ExecuteNonQuery(); progressDlg.OperationCurPart++; } cmd.CommandText = String.Format("CREATE SCHEMA `{0}` DEFAULT CHARACTER SET utf8 ;", dbname); cmd.ExecuteNonQuery(); cmd.CommandText = String.Format("USE `{0}` ;", dbname); cmd.ExecuteNonQuery(); progressDlg.OperationText = String.Format("Создаем таблицы в <{0}>", dbname); progressDlg.OperationCurPart++; var myscript = new MySqlScript(connectionDB, sqlScript); myscript.StatementExecuted += Myscript_StatementExecuted;; var commands = myscript.Execute(); logger.Debug("Выполнено {0} SQL-команд.", commands); progressDlg.Destroy(); progressDlg = null; MessageDialogWorks.RunInfoDialog("Создание базы успешно завершено.\nЗайдите в программу под администратором для добавления пользователей."); }