MySQL全局触发连接

时间:2013-04-16 20:32:31

标签: mysql database rdbms mysql-workbench

是否可以创建一个触发器来监听一个数据库连接/实例(所有模式)的任何插入或更新?

以下是我的商业案例:

  • 我在一台MySQL服务器上有多个模式。
  • 这些架构中的每一个都有多个表格。
  • 所有表格都有一个'lastChanged'datetime列。
  • 每当在该表上发生更新或插入时,我都需要更新表中的“lastChanged”列。

总而言之,我希望看看是否有可能创建一个全局规则来实现它,这样我就不需要在每个模式中为每个表创建一个触发器。

我对触发器没有多少经验,所以如果你想到触发器以外的其他东西作为捕获这些事件和更新相应表中的行的答案,那将是一个很棒的答案!!

1 个答案:

答案 0 :(得分:1)

您无法通过单个触发器执行此操作。

但是,如果您从DATETIME to TIMESTAMP更改lastChanged列,则可以使用DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP功能在任何插入或更新时自动设置值。

一个权衡是TIMESTAMP数据类型只能支持1970年到2038年之间的值,因此如果您需要存储超出该范围的值,则无法使用该值。

由于您希望尽可能简单,并且您说所有表都已有一个名为lastChanged的列,您可以考虑使用information_schema生成所需的alter table语句,然后立即执行所有操作。

这样的事情:

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