1

我处于触发上下文中,并试图让以下代码段起作用。

execute format('insert into %I (user_name, action, new_values, query) 
    values (''%I'', ''i'', hstore(($1).*), current_query())', 
     tg_table_name::text || '_audit', current_user::text)
using new;

我收到以下错误

[SQL]insert into book (title, n_pages) values ('PG is Great', 250);

[Err] ERROR:  row expansion via "*" is not supported here
LINE 2: values ('u1', 'i', hstore(($1).*), current_q...
                                               ^
QUERY:  insert into book_audit (user_name, action, new_values, query) 
        values ('u1', 'i', hstore(($1).*), current_query())
CONTEXT:  PL/pgSQL function "if_modified_func" line 8 at EXECUTE statement

这里不支持有关如何通过“*”修复行扩展的任何建议?耦合到特定模式不是一种选择。

4

1 回答 1

0

从我的脑海中,它应该像这样工作:

EXECUTE format('
   INSERT INTO %I (user_name, action, new_values, query) 
   SELECT $1, ''i'', $2, current_query()'
   , tg_table_name::text || '_audit')
USING current_user, hstore(NEW);

最好在USING子句中提供所有值。
您可以直接将记录投射到 hstorehstore(record).

于 2013-08-21T07:56:53.163 回答