от
Если у меня
trigger
before the update
на столе, как я могу бросить ошибку, которая предотвращает обновление на этом столе?

Ваш ответ

Отображаемое имя (по желанию):
Конфиденциальность: Ваш электронный адрес будет использоваться только для отправки уведомлений.
Анти-спам проверка:
Чтобы избежать проверки в будущем, пожалуйста войдите или зарегистрируйтесь.

7 Ответы

0 голосов
от
Если у меня
trigger
before the update
на столе, как я могу бросить ошибку, которая предотвращает обновление на этом столе?
0 голосов
от
Вот один хак, который может работать. Это не чистый, но, похоже, это может сработать: По сути, вы просто попробуйте обновить столбец, который не существует.
0 голосов
от
С MySQL 5.5, вы можете использовать синтаксис
SIGNAL
исключение:
signal sqlstate '45000' set message_text = 'My Error Message';
Состояние 45000 универсального государства, представляющего "необрабатываемое исключение пользовательской". Вот более полный пример такого подхода:
delimiter //
use test//
create table trigger_test
(
    id int not null
)//
drop trigger if exists trg_trigger_test_ins //
create trigger trg_trigger_test_ins before insert on trigger_test
for each row
begin
    declare msg varchar(128);
    if new.id
0 голосов
от
К сожалению, ответ предусмотренных @RuiDC не работает в версиях MySQL до 5.5, потому что нет реализации сигнала для хранимых процедур. Решение я нашел, чтобы сымитировать сигнал бросать ошибка
table_name doesn't exist
, толкая перед собой настраиваемое сообщение об ошибке в
table_name
. Хак может быть реализована с помощью триггеров или с помощью хранимой процедуры. Я опишу оба варианта ниже следующем примере используется @RuiDC. С помощью триггеров
DELIMITER $$


С помощью хранимой процедуры

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



DELIMITER $$
0 голосов
от
Следующая процедура (на mysql5) способ бросить пользовательские ошибки и регистрировать их одновременно:
create table mysql_error_generator(error_field varchar(64) unique) engine INNODB;
DELIMITER $$
CREATE PROCEDURE throwCustomError(IN errorText VARCHAR(44))
BEGIN
    DECLARE errorWithDate varchar(64);
    select concat("[",DATE_FORMAT(now(),"%Y%m%d %T"),"] ", errorText) into errorWithDate;
    INSERT IGNORE INTO mysql_error_generator(error_field) VALUES (errorWithDate);
    INSERT INTO mysql_error_generator(error_field) VALUES (errorWithDate);
END;
$$
DELIMITER ;


call throwCustomError("Custom error message with log support.");
0 голосов
от
CREATE TRIGGER sample_trigger_msg 
    BEFORE INSERT
FOR EACH ROW
    BEGIN
IF(NEW.important_value)
0 голосов
от
Другой (Хак) способ (если вы не на 5.5 по какой-то причине), которые вы можете использовать: Если у вас есть необходимое поле, то в триггере установить обязательное поле недопустимое значение, например нуль. Это будет работать для INSERT и Update. Отметим, что если null является допустимым значением для поля (по какой-то причине), то этот подход не будет работать.
BEGIN
    

Если вы находитесь на 5.5 , то вы можете использовать состояние сигнала, как описано в других ответах:

BEGIN
...