我正在尝试实现一个通用的触发器过程来启用对表的版本控制方案的排序。表格都包含版本和当前字段。在更新时,在某些基于条件的情况下,我想创建一个行的新版本而不是更新旧版本。我无法获取主键字段的默认值(始终 id )。
这就是我所做的:
CREATE FUNCTION version_trigger() RETURNS trigger AS $$
DECLARE
id_default text;
id_value text;
BEGIN
IF version_condition() THEN
old.current = false;
-- I can read the default value
SELECT column_default INTO id_default
FROM information_schema.columns
WHERE table_name = TG_TABLE_NAME AND column_name = 'id';
-- THIS DOESN'T WORK!
EXECUTE 'SELECT $1' INTO id_value USING id_default;
new.id = id_value;
EXECUTE 'INSERT INTO ' || quote_ident(TG_TABLE_NAME) || ' SELECT ($1).*' USING new;
RETURN old;
END IF;
-- regular UPDATE
RETURN new;
END
$$ LANGUAGE plpgsql;
我只是错过了我读取id的默认值的步骤(它只是一个nextval()调用)。任何人都可以帮忙吗?
提前致谢!
答案 0 :(得分:1)
您不能将占位符用于表达式。
如果DEFAULT没有对记录数据的任何引用,那么你可以使用EXECUTE语句,但有点不同
postgres=# DO $$
DECLARE x text; y text;
BEGIN
x := (SELECT column_default
FROM information_schema.columns
WHERE table_name = 'omega' AND column_name = 'a');
EXECUTE 'SELECT ' || x INTO y;
RAISE NOTICE '%', y;
END;
$$;
NOTICE: 2
DO