pim*_*ttc 5 postgresql trigger audit metadata update
在新项目的数据库中,我已经开始约定让每个表都有一个最后修改的时间戳列。为了实现这一点,我为每个表编写了一个触发器:
CREATE TRIGGER touch_users
BEFORE UPDATE
ON users
FOR EACH ROW
WHEN (OLD.modification_time IS NOT DISTINCT FROM NEW.modification_time)
EXECUTE PROCEDURE touch_modification_time();
CREATE TRIGGER touch_company
BEFORE UPDATE
ON company
FOR EACH ROW
WHEN (OLD.modification_time IS NOT DISTINCT FROM NEW.modification_time)
EXECUTE PROCEDURE touch_modification_time();
-- etc for each table
Run Code Online (Sandbox Code Playgroud)
这很快就会变得乏味;特别是因为它们完全相同,除了表名。
有没有办法可以减少每个表所需的样板文件?或者甚至可能通过一个默认作用于每个表的触发器完全消除它?
用于多个触发器的单个触发器功能:可能 - 这就是你所做的。
多个表的单个触发器:不可能。
但是您可以缩短创建大量触发器的代码:
DO
$$
BEGIN
EXECUTE (
SELECT string_agg('CREATE TRIGGER touch_users
BEFORE UPDATE ON ' || quote_ident(t) || '
FOR EACH ROW
WHEN (OLD.modification_time IS NOT DISTINCT FROM NEW.modification_time)
EXECUTE PROCEDURE touch_modification_time();'
, E'\n')
FROM unnest('{users, company, foo, bar}'::text[]) t -- list your tables here
);
END
$$;
Run Code Online (Sandbox Code Playgroud)
或者从系统目录中收集表名称:
上一时期访问的表
归档时间: |
|
查看次数: |
3068 次 |
最近记录: |