【发布时间】:2015-07-13 22:38:59
【问题描述】:
我无法让此代码正常工作。这是作为插入、更新或删除触发器的结果执行的。将从多个表触发器调用相同的代码。因此,我不知道表名是什么或它们的列是什么。有什么想法吗?
EXECUTE format('INSERT INTO %s VALUES %s', _tbl, (OLD).*);
错误是关于没有用引号括起来的字符串:
ERROR: column "bangor" does not exist
LINE 1: INSERT INTO sample_test_table_deletes VALUES (3,bangor,D,"20...
^
另一方面,以下工作:
INSERT INTO my_table VALUES((OLD).*);
也就是说,当查询不是通过执行块时。
更新(触发代码):
CREATE OR REPLACE FUNCTION sample_trigger_func() RETURNS TRIGGER AS $$
DECLARE
operation_code char;
table_name varchar(50);
delete_table_name varchar(50);
old_id integer;
BEGIN
table_name = TG_TABLE_NAME;
delete_table_name = TG_TABLE_NAME || '_deletes';
SELECT SUBSTR(TG_OP, 1, 1)::CHAR INTO operation_code;
IF TG_OP = 'DELETE' THEN
OLD.mod_op = operation_code;
OLD.mod_date = now();
RAISE INFO 'OLD: %', (OLD).name;
EXECUTE format('INSERT INTO %s VALUES %s', delete_table_name, (OLD).*);
ELSE
EXECUTE format('UPDATE TABLE %s SET mod_op = %s AND mod_date = %s'
, TG_TABLE_NAME, operation_code, now());
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
【问题讨论】:
-
你得到的错误是什么?
_tblcom 来自哪里?触发器的完整代码是什么? -
嗨。谢谢。我添加了错误。
-
那么触发码呢?请不要和我们玩 20 个问题...
-
添加了触发代码
-
你写:
This is executed as a result of a delete trigger.但是你有一个ELSEtwig forINSERT/UPDATE.. 这是完全无效的。请澄清你要做什么。我怀疑每个可能的 original 表都有mod_op列?我建议你开始一个新问题。将此集中在所提出的主题上,并将其余部分放在一个新问题中。
标签: database postgresql triggers plpgsql postgresql-9.1