我想在一个表上创建一个Postgres触发器,以便在插入或更新行时运行。该表有很多列,我希望触发器将该行插入另一个表中。但是在另一个表中,所有这些列应该合并为一个JSON对象(在较新版本的Postgres中为JSONB)。
原始表格
column1|column2|column3 |
-------|-------|--------|
A |B |C |
新表格
combined_column |
---------------------------------------|
{ column1: A, column2: B, column3: C } |
因此,创建触发器的表将具有例如3列,但是触发器插入的表将只有1列(JSON对象组合原始表中插入/更新的行的所有列) )。
答案 0 :(得分:0)
以原始形式保存行会更有效。无需转换,占用更少的磁盘空间,更快,更清洁。
只需创建一个结构相同的日志表:
CREATE TABLE tbl_log AS TABLE tbl LIMIT 0;
触发功能:
CREATE OR REPLACE FUNCTION trg_tbl_log()
RETURNS trigger AS
$func$
BEGIN
INSERT INTO tbl_log SELECT (NEW).*;
RETURN NEW;
END
$func$ LANGUAGE plpgsql;
触发:
CREATE TRIGGER tbl_log
BEFORE INSERT OR UPDATE ON tbl
FOR EACH ROW EXECUTE PROCEDURE trg_tbl_log();
如果需要,您可以使用json
轻松将行转换为row_to_json()
值。或者更简单,只需to_json()
。最好使用to_jsonb()
并保存jsonb
而不是json
:
...
INSERT INTO generic_js_log (json_column) SELECT to_jsonb(NEW);
...