2013-04-16 2 views
1

Возможно ли создать триггер, который будет прослушивать любую вставку или обновление для одного соединения/экземпляра базы данных (все схемы)?MySQL Глобальные триггеры для подключения

Вот мой бизнес-кейс:

  • У меня есть несколько схем, расположенных на одном сервере MySQL.
  • Каждая из этих схем имеет несколько таблиц.
  • Все таблицы имеют столбец datetime lastChanged.
  • Мне нужно обновить столбец «lastChanged» в таблице всякий раз, когда в этой таблице происходит обновление или вставка.

Таким образом, я хочу посмотреть, можно ли создать глобальное правило, которое сделает это, поэтому мне не нужно создавать триггер для каждой таблицы в каждой схеме.

У меня мало опыта работы с триггерами, поэтому, если вы думаете о чем-то, кроме триггера, как о ответе на то, чтобы поймать эти события и обновить строки в соответствующих таблицах, это было бы замечательным ответом!

ответ

1

Вы не можете сделать это с помощью одного триггера.

Однако, если вы изменили столбец lastChanged с DATETIME to TIMESTAMP, вы можете использовать функцию DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, чтобы установить значение автоматически при любой вставке или обновлении.

Одним из компромиссов является то, что тип данных TIMESTAMP может поддерживать только значения с 1970 по 2038 год, поэтому вы не можете использовать их, если вам нужно хранить значения вне этого диапазона.

Поскольку вы хотите сделать это как можно более простым, и вы сказали, что все таблицы уже имеют столбец с именем lastChanged, вы можете использовать information_schema для создания необходимых вам операторов таблиц, а затем выполнить их все в один раз.

Что-то вроде этого:

select concat('alter table ', 
    t.table_schema, 
    '.', 
    t.table_name, 
    ' modify column ', 
    c.column_name, 
    ' timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;') as ddl 
into outfile '/tmp/lastChanged.sql' 
from information_schema.columns c 
    inner join information_schema.tables t 
    on t.table_schema = c.table_schema and t.table_name = c.table_name 
where c.table_schema = database() 
and c.data_type = 'datetime' 
and c.column_name = 'lastChanged' 
and t.table_type = 'base table'; 

\. /tmp/lastChanged.sql 
Смежные вопросы