我有一个120列的表。我需要设置审计跟踪,如果更改了任何列,就会记录它。因为它是现在,我想我必须建立与条件是这样的一个触发每列:MySQL更新触发器 - 找到更改的列?
IF(NEW.columnName != OLD.columnName)
THEN //log the old value
这将需要进行120次......虽然我已经接受了这种方式20年以前,今天我拒绝相信自动化这样一个简单的程序自动找到更改的列是不可能的。
这是我迄今发现:
- 既不新鲜也不OLD是一个表,它是一种语言结构,因此,你可以不会做或类似的东西“现在选择*。”
- 动态SQL在触发器中是不允许的(这可能解决了这个问题)。
- 在触发器中不允许使用动态SQL的过程(严重的是,Oracle,无论如何,看起来您都很努力禁用此功能)。
我正在考虑使用BEFORE和AFTER触发器与临时表和变量一起使用,这可能会解决问题,但是又需要动态SQL。我觉得我陷入了死胡同。
有没有解决方案呢?
一个问题:在PostgreSQL中可能吗?
更新:我发现2个可能的解决方案。然而他们都不看不够清楚对我说:使用活动作为一种解决方法结合使用触发器使用动态SQL workaround
- 。我不得不承认,我不太明白,这是否意味着EVENT无论如何都会每秒发射一次?
- This article表示只要使用临时表就可以在触发器内使用动态SQL。这仍然使用动态SQL,所以我不太明白。
你检查这与[在Postgres的会话信息函数为您的最后一个问题](http://stackoverflow.com/questions/8759595/within-a-trigger-function-how-to-get-which-fields-are-being-updated ) – bonCodigo
@bonCodigo谢谢,显然PostgreSQL在这种情况下更加灵活。 – Caballero