如何在更新触发器的动态 SQL 语句中使用“旧”或“新”?

exh*_*uma 2 postgresql trigger

假设我在行更新上执行以下函数:

CREATE OR REPLACE FUNCTION versioned_update()
RETURNS TRIGGER AS $$
DECLARE
     sql TEXT;
BEGIN
    sql := 'INSERT INTO backup_table VALUES (OLD)';
    EXECUTE sql;
END;
$$ language 'plpgsql';
Run Code Online (Sandbox Code Playgroud)

上面的示例不起作用,因为OLD在该执行上下文中未知。所以我尝试了类似的方法:

sql := format('INSERT INTO backup_table VALUES (%L)', OLD);
Run Code Online (Sandbox Code Playgroud)

sql := format('INSERT INTO backup_table VALUES (%L)', (OLD));
Run Code Online (Sandbox Code Playgroud)

sql := format('INSERT INTO backup_table VALUES (%L)', (OLD.*));
Run Code Online (Sandbox Code Playgroud)

一切都没有任何运气。

这个问题是我正在研究的一个更大的触发因素的一部分。孤立来看,这没有多大意义,但说明了问题。

exh*_*uma 5

经过多次尝试和错误,我终于弄清楚了。诀窍是复合​​数据类型的表示法(更重要的是它们的用法),这最终导致我这样做:

CREATE OR REPLACE FUNCTION versioned_update()
RETURNS TRIGGER AS $$
DECLARE
     sql TEXT;
BEGIN
    sql := 'INSERT INTO backup_table VALUES $1.*';
    EXECUTE sql USING OLD;
END;
$$ language 'plpgsql';
Run Code Online (Sandbox Code Playgroud)