如何绕过插入时丢失的记录类型

时间:2013-05-14 13:56:39

标签: postgresql triggers

我想在另一个表中的字段寻址的一个表中复制一行,如下所示:

CREATE OR REPLACE FUNCTION f_ins_up_vorb()
RETURNS TRIGGER AS $$
DECLARE
    dienst      dienst%ROWTYPE;
    account     record; 
BEGIN
    -- ...
    EXECUTE format('SELECT * FROM %s WHERE id=$1',dienst.tabelle)
    USING NEW.id INTO account;
    EXECUTE 'INSERT INTO ' || dienst.tabelle || 'shadow SELECT ($1).*, now(), $2' USING account, jobid;
    RETURN NEW;
END
$$ LANGUAGE plpgsql;

但这会产生:

ERROR:  record type has not been registered
CONTEXT:  SQL statement "INSERT INTO accountadshadow SELECT ($1).*, now(), $2"
PL/pgSQL function f_ins_up_vorb() line 30 at EXECUTE statement

dienst.tabelle解决的表没有通用类型,但目标表(dienst.tabelle || 'shadow')始终是源表的超集。所以这应该始终有效(并且 在触发器函数中工作,我使用NEW,它似乎有一个记录类型。)

这有什么办法吗?

1 个答案:

答案 0 :(得分:2)

尝试类似:

CREATE OR REPLACE FUNCTION f_ins_up_vorb()
RETURNS TRIGGER AS $$
DECLARE
    dienst      dienst%ROWTYPE;
BEGIN
    -- ...
    EXECUTE 'INSERT INTO '||dienst.tabelle||'shadow
             SELECT *, now(), $2
             FROM '||dienst.tabelle||' 
             WHERE id=$1'
    USING NEW.id, jobid;
    RETURN NEW;
END
$$ LANGUAGE plpgsql;

如果您尝试创建某种日志触发器,请先阅读this页面。