在触发器(存储过程)中将数据从父表重定向到子表时,无法在表中插入行

时间:2014-12-14 02:00:02

标签: postgresql partitioning

我正在使用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)”行已成功插入行

2 个答案:

答案 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 ,我在声明之前设置了搜索路径