Это невозможно стандартным способом в MySQL. Вы должны использовать триггер.
Например, следующее сравнивает значение ID_USER
, которое было передано в операторе обновления, с именем текущего пользователя базы данных и прерывает обновление, если они отличаются, используя синтаксис SIGNAL , чтобы поднять ошибку.
DELIMITER $
CREATE TRIGGER checkUpdateTable1
BEFORE UPDATE ON Table1
FOR EACH ROW
BEGIN
SELECT 1
FROM mysql.user
INTO @is_root
WHERE super_priv='Y' AND USER() = CONCAT(user, '@', host);
IF (@is_root IS NULL AND NEW.ID_USER <> USER()) THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'error message';
END IF
END
$
DELIMITER ;
Примечание: после комментария Рэймонда Нейланда я отредактировал пост, чтобы пользователи SUPER
могли обновить любую строку.
Лучшая практика должна была бы выставить события на UserControl
тот пузырь события до родительской формы. Я шел вперед и соединил пример для Вас. Вот описание того, что обеспечивает этот пример.
UserControl1
UserControl
с TextBox1
UserControl
названный ControlChanged
UserControl
зарегистрируйте обработчик событий для TextBox1
TextChangedEventTextChangeEvent
функция-обработчик я звоню ControlChanged
событие для пузырения к родительской формеForm1
UserControl1
на разработчикеUserControl1
для MouseLeave
и для ControlChanged
Вот снимок экрана, иллюстрирующий что ControlChanged
событие, которое я определил на UserControl
доступно через UX в Visual Studio на родительской форме Windows.
Лучшая модель для этого вида вещи будет создавать пользовательские события на Вашем пользовательском элементе управления и повышать их в подходящее время.
Ваш сценарий довольно сложен, но не неслыхан. (Я нахожусь на самом деле в очень похожем режиме на одном из моих текущих проектов.) Способ, которым я приближаюсь к нему, состоит в том, что пользовательский элемент управления ответственен за свою собственную проверку. Я не использую CausesValidation; вместо этого в соответствующей точке пользовательского элемента управления, я выполняю проверку посредством переопределения ValidateChildren (). (Это обычно происходит, когда пользователь нажимает "Save" или "Next" на пользовательском элементе управления для меня.)
Не будучи знакомым с Вашим пользовательским элементом управления UI, который не может составить 100% правильный подход для Вас. Однако, если Вы генерируете пользовательские события (возможно с пользовательским EventArgs, который указывает, выполнить ли проверку), необходимо смочь добраться, где Вы хотите быть.
Вам нужно будет подключить события, которые вы хотите фиксировать внутри вашего пользовательского элемента управления, и опубликовать их через некоторые пользовательские свойства событий в самом пользовательском элементе управления. Простым примером может быть обертывание события нажатия кнопки:
// CustomControl.cs
// Assumes a Button 'myButton' has been added through the designer
// we need a delegate definition to type our event
public delegate void ButtonClickHandler(object sender, EventArgs e);
// declare the public event that other classes can subscribe to
public event ButtonClickHandler ButtonClickEvent;
// wire up the internal button click event to trigger our custom event
this.myButton.Click += new System.EventHandler(this.myButton_Click);
public void myButton_Click(object sender, EventArgs e)
{
if (ButtonClickEvent != null)
{
ButtonClickEvent(sender, e);
}
}
Затем в форме, использующей этот элемент управления, вы подключаете событие, как и любое другое:
// CustomForm.cs
// Assumes a CustomControl 'myCustomControl' has been added through the desinger
this.myCustomControl.ButtonClickEvent += new System.EventHandler(this.myCustomControl_ButtonClickEvent);
myCustomControl_ButtonClickEvent(object sender, EventArgs e)
{
// do something with the newly bubbled event
}
Я хотел бы отметить, что, как описано, на самом деле это звучит так, как будто вы преследуете отвлекающий маневр. Хотя кажется, что у вас есть ситуация, когда отсутствие пузырьков событий в WinForms вызывает у вас проблемы, на самом деле плохая архитектура вынуждает вас нуждаться в пузырях событий, когда вы этого не должны.
Если вы можете провести рефакторинг / реструктуризацию своего дизайна таким образом, чтобы элементы управления работали с общей моделью данных (очевидный выбор - MVC / MVP), тогда вы можете просто применить общие шаблоны WinForms, такие как события PropertyChanged, в модели, чтобы сообщить вашей основной форме и любые другие элементы управления, которые используют эти данные для обновления.
Короче говоря, другие ответы разумны в том смысле, что они отвечают на заданный вопрос. Но с точки зрения качества кода, я думаю, что лучший ответ - отделить данные от пользовательского интерфейса.