我正在使用postgres版本:x86_64-unknown-linux-gnu上的 PostgreSQL 9.2.4,由gcc编译(Debian 4.7.2-5)4.7.2,64位
描述:
我有一个父表,父表有很多子表。我想将数据从父表重定向到子表(插入时)
(与此链接相同:Example Link)(冰淇淋公司的例子)
我做了以下事情...
create table tsttbl1 (id integer, name text);
create table tsttbl1_hour0 (LIKE tsttbl1) INHERITS (tsttbl1);
CREATE OR REPLACE FUNCTION insert_tsttbl1_hourbase() RETURNS TRIGGER AS $$
BEGIN
RAISE NOTICE 'Hi...%', NEW;
execute 'INSERT INTO ' || TG_TABLE_SCHEMA|| '.tsttbl1_hour0 values '|| NEW;
-- INSERT INTO tsttbl1_hour0 values (NEW.*)';
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
create trigger trigger_insert_tsttbl1_hourbase before insert on tsttbl1 FOR EACH ROW EXECUTE PROCEDURE insert_tsttbl1_hourbase();
在这里,
父表: - tsttbl1
子表: - tsttable1_hour0
尝试实现:insert into tsttbl1 (id, name) values (0,'xyz');
应在 tsttable1_hour0 中插入数据,而不是 tsttbl1 ;
但是当我试图插入行时,我就是这样......
ccc=# insert into tsttbl1 (id,name) values (1, 'abc');
LOG: statement: insert into tsttbl1 (id,name) values (1, 'abc');
NOTICE: Hi...(1,abc)
ERROR: column "abc" does not exist
LINE 1: INSERT INTO act1.tsttbl1_hour0 values (1,abc)
^
QUERY: INSERT INTO act1.tsttbl1_hour0 values (1,abc)
CONTEXT: PL/pgSQL function insert_tsttbl1_hourbase() line 4 at EXECUTE statement
其他信息:
- >这种数据重定向也可以通过规则来实现。但对于我的情况,这种插入经常发生,因此与触发器相比,规则可能代价高昂......
所以我想通过触发器来实现这一点。
- >如果我取消评论,则“INSERT INTO tsttbl1_hour0 values(NEW。*)'”行已成功插入行
- >如果我取消评论,则“INSERT INTO tsttbl1_hour0 values(NEW.id,NEW.name)”行已成功插入行
答案 0 :(得分:1)
execute
命令正在调用动态sql。它将执行后面的字符串,但粘贴在一起的语法不正确。它应该是:
execute 'INSERT INTO ' || TG_TABLE_SCHEMA|| '.tsttbl1_hour0 values (' || NEW.id || ', ''' || NEW.name || ''')';
这会让这条线工作,但不是将这些线粘贴在一起,而是使用值,绑定会更好。请参阅PREPARE命令。
但为什么要使用动态sql而不是成功运行的注释行呢?
答案 1 :(得分:0)
我的问题以这种方式解决了......
CREATE OR REPLACE FUNCTION insert_tsttbl1_hourbase() RETURNS TRIGGER AS $$
BEGIN
RAISE NOTICE 'Hi...%', NEW;
Execute 'set search_path to ' || TG_TABLE_SCHEMA|| '';
INSERT INTO tsttbl1_hour0 values (NEW.*);
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
而不是 schemaname.tablename ,我在声明之前设置了搜索路径。