Postgresql 在Pl/PgSQL中的变量中选择列默认值

Postgresql 在Pl/PgSQL中的变量中选择列默认值,postgresql,triggers,plpgsql,Postgresql,Triggers,Plpgsql,我正在尝试实现一个通用触发器过程,以便在表上启用排序和版本控制方案。所有表都有版本和当前字段。在更新时,在某些基于条件的情况下,我希望创建行的新版本,而不是更新旧版本。我无法获取主键字段的默认值(始终id) 以下是我所做的: CREATE FUNCTION version_trigger() RETURNS trigger AS $$ DECLARE id_default text; id_value text; BEGIN IF version_condition()

我正在尝试实现一个通用触发器过程,以便在表上启用排序和版本控制方案。所有表都有版本当前字段。在更新时,在某些基于条件的情况下,我希望创建行的新版本,而不是更新旧版本。我无法获取主键字段的默认值(始终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()调用)。有人能帮忙吗


提前谢谢

表达式不能使用占位符

若默认值并没有任何对记录数据的引用,那个么您可以使用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