Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / MySQL Новый топик    Ответить
 Triggers?  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3411
Если я правильно понял:
триггеров на одно событие может быть несколько, порядок их выполнения не должен быть важен, но все-таки - какой?
В зависимости от выбранного типа ENGINE поведение триггера, точнее результаты его работы могут кардинально отличаться.
15 окт 19, 17:45    [21994867]     Ответить | Цитировать Сообщить модератору
 Re: Triggers?  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 19997
Триггеры выполняются в порядке их создания, если не задано иное при создании триггера (для создаваемого триггера можно задать, перед каким существующим его поместить).
15 окт 19, 17:57    [21994874]     Ответить | Цитировать Сообщить модератору
 Re: Triggers?  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3411
Есть база, хочу перенести данные из другой базы (не MySQL, MariaDB).

Надо запретить все триггеры во всех таблицах, перенести данные, разрешить триггеры

Как запретить/разрешить все триггеры в базе?
17 окт 19, 13:48    [21996514]     Ответить | Цитировать Сообщить модератору
 Re: Triggers?  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 19997
Никак. Только удаление и последующее восстановление.
17 окт 19, 15:20    [21996637]     Ответить | Цитировать Сообщить модератору
 Re: Triggers?  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3411
Akina
Никак. Только удаление и последующее восстановление.


да, уж....
нашел еще: сделать переменную и в триггеры насовать проверки, чтобы не выполнялись.
Это, если триггеры свои и их не до фига.

Как сделать глобальную переменную?
17 окт 19, 15:43    [21996673]     Ответить | Цитировать Сообщить модератору
 Re: Triggers?  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3411
Akina
Никак. Только удаление и последующее восстановление.


и еще: как загрузить данные в живую базу, но чтобы триггеры не работали?
Особенно, если база чужая.
Понятно, что можно заскриптовать все триггеры, удалить и потом пересоздать. Это единственный варант?
17 окт 19, 15:52    [21996680]     Ответить | Цитировать Сообщить модератору
 Re: Triggers?  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 19997
Ролг Хупин
нашел еще: сделать переменную и в триггеры насовать проверки, чтобы не выполнялись.
Это, если триггеры свои и их не до фига.
А смысл? всё равно они не редактируются, так что по-любому получить его текст. А, имея текст, проще удалить. чем создать наново, но с дополнительной проверкой.
Ролг Хупин
как загрузить данные в живую базу, но чтобы триггеры не работали?
Особенно, если база чужая.
Бэкап, подмена данных, рестор.
17 окт 19, 15:55    [21996685]     Ответить | Цитировать Сообщить модератору
 Re: Triggers?  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3411
[quot Akina]
Ролг Хупин
нашел еще: сделать переменную и в триггеры насовать проверки, чтобы не выполнялись.
Это, если триггеры свои и их не до фига.
А смысл? всё равно они не редактируются, так что по-любому получить его текст. А, имея текст, проще удалить. чем создать наново, но с дополнительной проверкой.

Вот так пишут
https://mysql-0v34c10ck.blogspot.com/2011/06/how-to-disableenable-triggers-on-demand.html
17 окт 19, 17:08    [21996772]     Ответить | Цитировать Сообщить модератору
 Re: Triggers?  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 19997
Ролг Хупин
Вот так пишут
Пусть пишут... вот только сам MySQL про эти переменные как-то не в курсе - в документации про них ни полслова.

Вот попытка воспроизвести то, что там написано (специально взята версия 5.6, указанная в статье):

Enter password: **********
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.6.10-log MySQL Community Server (GPL)

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> create table test (id int auto_increment primary key, val int);
Query OK, 0 rows affected (0.06 sec)

mysql> create trigger tr before insert on test for each row set new.val = new.id*new.id;
Query OK, 0 rows affected (0.05 sec)

mysql> insert into test values (10,10);
Query OK, 1 row affected (0.00 sec)

mysql> SET @TRIGGER_BEFORE_INSERT_CHECKS = FALSE;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into test values (20,20);
Query OK, 1 row affected (0.00 sec)

mysql> SET @TRIGGER_BEFORE_INSERT_CHECKS = TRUE;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into test values (30,30);
Query OK, 1 row affected (0.00 sec)

mysql> select * from test;
+----+------+
| id | val  |
+----+------+
| 10 |  100 |
| 20 |  400 |
| 30 |  900 |
+----+------+
3 rows in set (0.02 sec)

mysql>

Ещё вопросы есть?
17 окт 19, 19:13    [21996888]     Ответить | Цитировать Сообщить модератору
 Re: Triggers?  [new]
miksoft
Member

Откуда:
Сообщений: 37983
Ролг Хупин
Вот так пишут
https://mysql-0v34c10ck.blogspot.com/2011/06/how-to-disableenable-triggers-on-demand.html
Так там же такое:
IF ((@TRIGGER_CHECKS = FALSE)
      OR (@TRIGGER_BEFORE_INSERT_CHECKS = FALSE))
Это и есть "сделать переменную и в триггеры насовать проверки, чтобы не выполнялись"
18 окт 19, 00:30    [21996995]     Ответить | Цитировать Сообщить модератору
 Re: Triggers?  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 19997
miksoft
Это и есть "сделать переменную и в триггеры насовать проверки, чтобы не выполнялись"
А, точно. Невнимательно посмотрел.
Не, костыль.
18 окт 19, 08:09    [21997050]     Ответить | Цитировать Сообщить модератору
 Re: Triggers?  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3411
Все равно как-то не ясно: есть база, надо из другой базы перенести данные в нее:

1. триггеры - хоть и нельзя запретить, но, предположим как описано выше можно решить.
2. что делать с foreign keys и CONSTRAINT ? По-хорошему их тоже неплохо бы запретить до вставки и потом разрешить.
18 окт 19, 09:30    [21997092]     Ответить | Цитировать Сообщить модератору
 Re: Triggers?  [new]
miksoft
Member

Откуда:
Сообщений: 37983
Ролг Хупин,

Внешние ключи прекрасно выключаются.

Но я бы не советовал это делать, по крайней мере, без тщательной проверки входящих данных.
18 окт 19, 10:02    [21997123]     Ответить | Цитировать Сообщить модератору
 Re: Triggers?  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 19997
Ролг Хупин
есть база, надо из другой базы перенести данные в нее

Состояние, когда данные из другой базы добавляются к имеющимся, и при этом БД не подготовлена к тому, что на ней потребуется выполнять операцию слияния - в общем следует считать нештатным. И соответственно нет никакого повода обижаться и возмущаться, что процесс обложен граблями и требует костылей.

Ролг Хупин
что делать с foreign keys
Можно отключить. Лучше не отключать. необходимость грузить данные в правильном порядке и некоторое замедление процесса загрузки - небольшая цена за гарнтию целостности данных.

Ролг Хупин
что делать с ... CONSTRAINT
Смириться. Они крайне редко бывают сложными, и, следовательно, почти не тормозят процесс.
Но если вот реально упёрлось - то только так же, как с триггерами. Удалить, после слияния восстановить.
18 окт 19, 10:29    [21997156]     Ответить | Цитировать Сообщить модератору
 Re: Triggers?  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3411
Akina
Ролг Хупин
есть база, надо из другой базы перенести данные в нее

Состояние, когда данные из другой базы добавляются к имеющимся, и при этом БД не подготовлена к тому, что на ней потребуется выполнять операцию слияния - в общем следует считать нештатным. И соответственно нет никакого повода обижаться и возмущаться, что процесс обложен граблями и требует костылей.

Ролг Хупин
что делать с foreign keys
Можно отключить. Лучше не отключать. необходимость грузить данные в правильном порядке и некоторое замедление процесса загрузки - небольшая цена за гарнтию целостности данных.

Ролг Хупин
что делать с ... CONSTRAINT
Смириться. Они крайне редко бывают сложными, и, следовательно, почти не тормозят процесс.
Но если вот реально упёрлось - то только так же, как с триггерами. Удалить, после слияния восстановить.


Целевая база - новая, пустая, только структура.
18 окт 19, 13:56    [21997428]     Ответить | Цитировать Сообщить модератору
 Re: Triggers?  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 19997
Ролг Хупин
Целевая база - новая, пустая, только структура.
Пфф... А чего тогда огород городить? Прибить базу и развернуть с нуля из бэкапа.
18 окт 19, 15:02    [21997500]     Ответить | Цитировать Сообщить модератору
 Re: Triggers?  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3411
Огорода нет, создаю базу, натягиваю структуру, а там - есть некоторые минимальные данные и триггеры есть, с того и вопрос возник.
В постгресе я делал функцию, которая запрещает/разрешает. Ну, вот.

Ну, и извечная тяга к знаниям движет
18 окт 19, 15:39    [21997531]     Ответить | Цитировать Сообщить модератору
 Re: Triggers?  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 19997
Ролг Хупин
натягиваю структуру, а там - есть некоторые минимальные данные и триггеры есть
Ну так просто переносишь создание триггеров в конец скрипта...
18 окт 19, 21:04    [21997771]     Ответить | Цитировать Сообщить модератору
 Re: Triggers?  [new]
Alex_Ustinov
Member

Откуда: Nickel
Сообщений: 2955
Ролг Хупин,

ситуация запутанная..... весьма... но разрешима...
есть опция mysqldump --skip-triggers
в дампе автоматом добавляются флаги отключения констрейнтов
-- Отключение внешних ключей в начале
-- 
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
.......
-- Включение внешних ключей
-- 
/*!40014 SET FOREIGN_KEY_CHECKS = @OLD_FOREIGN_KEY_CHECKS */;

залить без триггеров, потом сделать дамп с триггерами --triggers и --no-date

Решение в лоб всегда самое простое...
17 дек 19, 17:15    [22042371]     Ответить | Цитировать Сообщить модератору
Все форумы / MySQL Ответить