- Сгенерировать ошибку в триггере MySQL
- Использование триггеров
- Использование хранимой процедуры
- Форум пользователей MySQL
- #1 07.11.2018 11:02:26
- Не работает триггер
- #2 07.11.2018 15:28:44
- Re: Не работает триггер
- #3 07.11.2018 16:59:12
- Re: Не работает триггер
- vasya написал:
- #4 07.11.2018 19:11:06
- Re: Не работает триггер
- #5 07.11.2018 19:20:15
- Re: Не работает триггер
- vasya написал:
- #6 07.11.2018 19:44:29
- Re: Не работает триггер
- Дмитрий22432 написал:
- #7 08.11.2018 10:28:44
- Re: Не работает триггер
- #8 08.11.2018 11:48:46
- Re: Не работает триггер
- #9 08.11.2018 12:23:46
- Re: Не работает триггер
- #10 08.11.2018 12:31:28
- Re: Не работает триггер
- #11 08.11.2018 12:37:18
- Re: Не работает триггер
- #12 08.11.2018 12:48:22
- Re: Не работает триггер
- #13 08.11.2018 13:04:25
- Re: Не работает триггер
- #14 08.11.2018 13:18:33
- Re: Не работает триггер
- #15 08.11.2018 13:45:36
- Re: Не работает триггер
- #16 08.11.2018 14:05:28
- Re: Не работает триггер
- #17 08.11.2018 14:44:51
- Re: Не работает триггер
- vasya написал:
- #18 08.11.2018 21:28:16
- Re: Не работает триггер
- #19 09.11.2018 12:42:18
- Re: Не работает триггер
- #20 09.11.2018 12:46:28
- Re: Не работает триггер
- Дмитрий22432 написал:
- #21 09.11.2018 13:00:04
- Re: Не работает триггер
- #22 09.11.2018 13:14:46
- Re: Не работает триггер
- #23 09.11.2018 13:26:01
- Re: Не работает триггер
- Не срабатывает простой триггер в MySQL. Почему?
- вы меня вымораживаете
Сгенерировать ошибку в триггере MySQL
Если у меня есть trigger before the update таблица, как я могу выдать ошибку, которая препятствует обновлению этой таблицы?
Вот один хак, который может сработать. Это не чисто, но похоже, что это может сработать:
По сути, вы просто пытаетесь обновить столбец, который не существует.
Начиная с MySQL 5.5, вы можете использовать SIGNAL синтаксис для генерации исключения :
Состояние 45000 является общим состоянием, представляющим «необработанное пользовательское исключение».
Вот более полный пример подхода:
К сожалению, ответ, предоставленный @RuiDC, не работает в версиях MySQL до 5.5, потому что нет никакой реализации SIGNAL для хранимых процедур.
Решение, которое я нашел, состоит в том, чтобы смоделировать сигнал, выдающий table_name doesn’t exist ошибку, помещая настроенное сообщение об ошибке в table_name .
Взлом может быть реализован с помощью триггеров или с помощью хранимой процедуры. Я опишу оба варианта ниже, следуя примеру, используемому @RuiDC.
Использование триггеров
Использование хранимой процедуры
Хранимые процедуры позволяют использовать динамический sql, что делает возможным инкапсуляцию функциональности генерации ошибок в одной процедуре. Суть в том, что мы должны контролировать методы вставки / обновления приложений, чтобы они использовали только нашу хранимую процедуру (не предоставляя прямые привилегии INSERT / UPDATE).
Источник
Форум пользователей MySQL
Задавайте вопросы, мы ответим
Страниц: 1 2
#1 07.11.2018 11:02:26
Не работает триггер
Только начала изучать sql и сразу же столкнулся с проблемами никак не работает триггер в mysql
create table parent (
id int not null primary key,
name char(80)
) engine=innodb;
create table child (
id int not null,
name char(80),
parent_id int,
foreign key(parent_id) references parent(id)
) engine=innodb;
пишу триггер следующего вида:
drop trigger if exists new_profile;
DELIMITER $$
CREATE TRIGGER new_profile AFTER INSERT ON parent
for each row
begin
insert into child(parent_id) values(new.id);
END $$
DELIMITER;
и он такое ощущение что не закрывает триггер и выводит строчки чтобы дальше вводить информацию. По видео урокам смотрел там все отрабатывает без проблем сам пробую ни в какую не хочет работать. Что я делаю не так?
Отредактированно Дмитрий22432 (07.11.2018 11:44:16)
#2 07.11.2018 15:28:44
Re: Не работает триггер
#3 07.11.2018 16:59:12
Re: Не работает триггер
vasya написал:
Спасибо тебе добрый человек, а то уже измучился весь. Часа 2 потратил на то чтобы найти причину и когда уже руки опустились решил спросить тут. Бред какой-то наделали, а ты потом мучийся пробелы ищи.
Сделал как ты написал но возникла другая ошибка:
Ввел:
INSERT INTO parent(id, name) values(1, ‘Vasya’);
Выдает ошибку:
Field ‘id’ doesn’t have a default value
может подскажешь из-за чего и как поправить.
#4 07.11.2018 19:11:06
Re: Не работает триггер
в таблице child поле id определено как not null, т.е должно быть какое-то значение
в триггере явно значение для этого поля не указывается
значение по умолчанию для этого поля не определено
поэтому и ругается
#5 07.11.2018 19:20:15
Re: Не работает триггер
vasya написал:
в таблице child поле id определено как not null, т.е должно быть какое-то значение
в триггере явно значение для этого поля не указывается
значение по умолчанию для этого поля не определено
поэтому и ругается
Значит я чего то не так понял, когда смотрел видео уроки. Там говорили
1. Если я пишу вот так:
INSERT INTO parent values(1, ‘Vasya’);
То нужно указывать значения для всех полей.
2. Если я пишу вот так:
INSERT INTO parent(name) values(‘Vasya’);
то можно присваивать значения определенным ячейкам в данном случае в ячейке name будет ‘Vasya’ а остальные ячейки будут пустые.(ну если конечно же не стоит флага not null).
я и думал что если пишу
INSERT INTO parent(id, name) values(1, ‘Vasya’); то явно указываю что хочу в поле id поместить цифру 1.
Каким образом явно указать значение, подскажи пожалуйста. А то с этими уроками больше мучений чем учебы.
Отредактированно Дмитрий22432 (07.11.2018 19:32:22)
#6 07.11.2018 19:44:29
Re: Не работает триггер
Дмитрий22432 написал:
я и думал что если пишу
INSERT INTO parent(id, name) values(1, ‘Vasya’); то явно указываю что хочу в поле id поместить цифру 1.
да всё верно
но когда вы добавляете строку в таблицу parent, триггер добавляет строку в таблицу child
и в той команде insert (которая внутри тригера) нет явного указания для поля id из таблицы child
варианты:
-) убрать not null
-) добавить default
-) определить id как auto_increment
#7 08.11.2018 10:28:44
Re: Не работает триггер
Все понятно, спасибо огромное вам за разъяснение.
А подскажи еще пожалуйста, как можно сделать выбор с несколькими вариантами.
Допустим есть книги и нужно выбирать информацию или за определенный период или по выбранной книге. Такое реально сделать? Т.е. период может быть и не указан а конкретная книга указана или наоборот книга не указана а период указан.
#8 08.11.2018 11:48:46
Re: Не работает триггер
можно, но это вопрос к приложению, которое формирует запрос на основе указанных пользователем данных
#9 08.11.2018 12:23:46
Re: Не работает триггер
нужно использовать лишь скрипты sql без доп приложений
#10 08.11.2018 12:31:28
Re: Не работает триггер
тогда не ясно откуда берутся данные — указана книга или период
опишите подробней задачу
#11 08.11.2018 12:37:18
Re: Не работает триггер
если вам не сложно можете скинуть e-mail я вам туда напишу, чтобы тему не захламлять тем что не относится к данной теме.
или вот мой, отправьте мне просто любое письмо я вам отвечу. dmitrij_voronczov_1993@mail.ru
#12 08.11.2018 12:48:22
Re: Не работает триггер
лучше на форуме — одна голова хорошо, а больше лучше
#13 08.11.2018 13:04:25
Re: Не работает триггер
Имеется mysql база с книгами
Оттуда с помощью скриптов написанных на sql нужно вытянуть информацию:
Получать информацию о количестве прочитанных/непрочитанных книг за выбранный период или детальную информацию о выбранной книге.
интересует можно ли эти 2 условия реализовать в одном скрипте с возможностью выбора нужного, или просто написать 2 разных скрипта?
информацию о конкретной книге или периоде ввожу сам.
Отредактированно Дмитрий22432 (08.11.2018 13:06:20)
#14 08.11.2018 13:18:33
Re: Не работает триггер
вероятно мы по разному понимаем «sql скрипт»
с моей т.з. это файл с набором sql команд вида create, select, insert и т.д
простейший пример — дамп базы данных
как туда вводить информацию о конкретной книге или периоде?
возможно вы имеете в виду хранимую процедуру?
приведите пример отдельного скрипта для одного из условий
#15 08.11.2018 13:45:36
Re: Не работает триггер
create table books(
id int not null auto_increase,
name char(80),
activ boolean default false
price int not null,
kolctr int not null
);
Тут вводятся книги:
insert into books(name, price, kolctr) values(‘Название книги’, 1200, 135);
Тут вводятся книги допустим популярные:
insert into books(name, price, kolctr, activ) values(‘Название книги’, 1200, 135, true);
Затем делаю запрос:
select * from books where activ = true; — выводятся обычные книги
select * from books where activ = false; — выводтся популярные книги
Или если о конкретной книге:
select * from books where name = ‘Название книги’;
что-то вроде этого
Отредактированно Дмитрий22432 (08.11.2018 13:46:47)
#16 08.11.2018 14:05:28
Re: Не работает триггер
т.е. то просто текстовый файл?
вы можете написать там несколько select запросов, но никаких возможностей для выбора нужного нет
условные конструкции есть в хранимых процедурах (https://dev.mysql.com/doc/refman/8.0/en … edure.html)
#17 08.11.2018 14:44:51
Re: Не работает триггер
vasya написал:
т.е. то просто текстовый файл?
вы можете написать там несколько select запросов, но никаких возможностей для выбора нужного нет
условные конструкции есть в хранимых процедурах (https://dev.mysql.com/doc/refman/8.0/en … edure.html)
спасибо почитаю, я тебе отправил письмо не знаю куда тут должно прийти отправил вот так
#18 08.11.2018 21:28:16
Re: Не работает триггер
не приходило письмо, лучше тут отписывайте
#19 09.11.2018 12:42:18
Re: Не работает триггер
Как сделать изменение значения в таблице? Например есть такой пример
create table parent (
id int not null primary key,
name char(80),
activ boolean default false
);
create table child (
id int not null,
name char(80),
parent_id int,
foreign key(parent_id) references parent(id)
);
Можно каким-либо образом сделать чтобы в таблице ‘parent’ значение ‘activ’ меняло свое значение? Я сначала думал это сделать через триггер. Но подумал что если делать через него ведь он будет срабатывать каждый раз когда я допустим добавляю запись в child, а если у одного ‘parent’ 4-5 записей значит он сработает 4-5 раз.
Можно это еще как-то реализовать?
#20 09.11.2018 12:46:28
Re: Не работает триггер
Дмитрий22432 написал:
Можно каким-либо образом сделать чтобы в таблице ‘parent’ значение ‘activ’ меняло свое значение?
при каких условиях и как должно меняться значение?
#21 09.11.2018 13:00:04
Re: Не работает триггер
Вот пример с книгами:
create table book (
id int not null primary key,
name char(80),
activ boolean default false
);
create table customer (
id int not null,
name char(80),
book_id int,
foreign key(book_id) references book(id)
);
По умолчанию у книге статус ‘доступна’ и нужно чтобы при заказе книге т.е при добавлении записи в таблицу customer значение менялось на ‘не доступно’. Но нужно учесть что книгу могут заказать несколько человек.
Т.е. если бы заказывал только один человек то это легко можно было бы сделать через триггер, а вот как сделать если заказов на одну книгу может быть много я чего-то не придумаю.
#22 09.11.2018 13:14:46
Re: Не работает триггер
в программе, которая добавляет запись в customer сразу же и обновлять activ
но можно и через триггер
в чем проблема, если он будет срабатывать несколько раз?
#23 09.11.2018 13:26:01
Re: Не работает триггер
Я не знаю просто может это на что-то влияет
попробовал записать триггер вот таким образом не работает пишет что поле не найдено
DELIMITER $$
CREATE TRIGGER new_profile AFTER INSERT ON customer
for each row
begin
update book SET activ = TRUE WHERE/>END $$
DELIMITER ;
Источник
Не срабатывает простой триггер в MySQL. Почему?
Есть база linuxtr, есть таблица lt_articles. В этой таблице два поля — id (PRIMARY KEY, AUTO INCREMENT) и sort_order.
Задача: при добавлении новой записи, поле sort_order должно устанавливаться значением id.
Я делаю такой триггер:
Но он не срабатывает — при добавлении новой записи значение поля sort_order остается равным 0.
Что делаю не так?
Перед инсертом NEW.id еще неизвестно.
Блин, в SQLite известно, а в крутом MySQL не известно?
Вот здесь легко исользуют NEW в BEFORE INSERT:
в BEFORE INSERT поля auto-generated ещё не определены.
при добавлении новой записи, поле sort_order должно устанавливаться значением id.
При AFTER не работает выражение
SET NEW.sort_order = NEW.id;
Так как нет NEW.
Замена NEW на lt_articles не помогает.
Ты всегда знаешь, что sort_order будет уникальным (так как идет от id, а изменение последовательности — это всегда парная перестановка), а так же знаешь, что новые добавляемые строки будут последними при сортировке по sort_order.
Ну так и сортируй по id зачем то же самое 2 раза ?
Возможно и не работало, но не по этой причине
Возможно, тебя устроит NEW.sort_order=LAST_INSERT_ID()
Не умеешь пользоваться гуглом.
google://mysql trigger before insert auto_increment
Решение в первой ссылке:
Это вообще не по-человечески.
Возможно, тебя устроит NEW.sort_order=LAST_INSERT_ID()
Нет, поведение LAST_INSERT_ID() вообще неадекватное:
Вышел из положения так:
вы меня вымораживаете
In a BEFORE trigger, the NEW value for an AUTO_INCREMENT column is 0, not the sequence number that is generated automatically when the new row actually is inserted.
так нужно лезть на ЛОР.
SET NEW.Sort_Placement = LAST_INSERT_ID() + 1;
так нужно лезть на ЛОР.
а зачем читать, надрывать мозги, если лор скажет и так?
если LAST_INSERT_ID это «плохо» и «неадекватное поведение», то сделай SELECT COUNT(id) FROM table и прибавь 1. будет медленно, зато «хорошо» и «адекватно».
чего к человеку пристали
он просто не знает инглиш
а вы ему гугл в помощь суете
иногда я жалею, что игнор почистил, ОП сейчас первый кандидат.
незнание тех. английского это повод не лезть в профессию.
я работаю без знаний его уже 8 лет, в крайнем случае гугл переводчик, а так похожие слова ищу, и термины.
иди дворником работай, чучмо
я работаю без знаний его уже 8 лет, в крайнем случае гугл переводчик, а так похожие слова ищу, и термины.
ну ты и лошара анскильная ппц, откуда такие имбецилы получаются вообще? у вас там секта по рождению все новых и новых дегенератов международная открылась?
Чувак, ты не понимаешь сути проблемы.
В MySQL на триггерах существуют дикие ограничения, которые порождают логические коллизии.
То есть, при решении простой задачи «одно поле должно быть равно второму в момент добавления», MySQL предлагает ее решить со следующими ограничениями:
1. В BEFORE INSERT неизвестно значение автоинкрементального поля, но возможно установить значение поля-дубликата.
2. В AFTER INSERT значение автоинкрементального поля известно, но невозможно установить значение поля-дубликата.
3. В триггере AFTER INSERT нельзя сделать UPDATE на только что добавленную запись.
Еще обрати внимание, что задача шире, чем копирование численного ID, и ее в общем случае нельзя решать через математическое вычисление следующего ID каким-либо способом. Потому что при INSERT возможно два варианта:
1. Добавление без указания ID (и тогда ID вычисляется MySQL)
2. Добавление с указаинем ID (и тогда ID записывается в базу тот, который указан в запросе)
Очевидно, что все предложенные здесь решения (и через LAST_INSERT_ID(), и через information_schema.TABLES, и через MAX) в общем случае неработоспособны.
Я сделал для себя решение, которое работает в моем случае.
Но в топике задана вполне конкретная задача:
Задача: при добавлении новой записи, поле sort_order должно устанавливаться значением id.
Вот ее и нужно решить.
Надеюсь, ты прекрасно владеешь профессией, в отличие от меня, а так же знаешь английский, как я его не знаю, и тебе не составит труда написать решение.
Всего одна мессага с решением. Прошу:
если я правильно понял:
1. в таблицу делается insert: PK или генерится, или передается
2. для вставленной записи значение sort_order должно автоматом стать равно PK
3. выкинуть поле sort_order и использовать вместо него id — не вариант
незнание тех. английского это повод не лезть в профессию.
У меня давно складывается впечатление, что те, кто говорят о том, что они знают англицкий, на самом деле языка не знают. Точнее, ни настолько тупы, что им всего лишь кажется, что они знают англицкий. Познания их ущербны, а способность узреть знакомые слова в тексте принимаются за знания языка.
Я считаю, что человек имеет право говорить о том, что знает язык только в том случае, если он читает и пишет на нем как на родном, и может мыслить на иностранном языке. Вот тогда человек язык знает. Во всех остальных случаях посредственности вроде тебя занимаются самообманом, да еще и других людей вводят в заблуждение.
Я перевожу крупные тексты с англицкого:
но считаю, что англицкого не знаю.
Ты считаешь, что англицкий знаешь. Так покажи свои переводы, мы на них посмотрим и оценим твою профессиональную состоятельность.
1. в таблицу делается insert: PK или генерится, или передается
2. для вставленной записи значение sort_order должно автоматом стать равно PK
3. выкинуть поле sort_order и использовать вместо него id — не вариант
Источник