是否可以创建一个触发器来监听一个数据库连接/实例(所有模式)的任何插入或更新?
以下是我的商业案例:
总而言之,我希望看看是否有可能创建一个全局规则来实现它,这样我就不需要在每个模式中为每个表创建一个触发器。
我对触发器没有多少经验,所以如果你想到触发器以外的其他东西作为捕获这些事件和更新相应表中的行的答案,那将是一个很棒的答案!!
答案 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