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)
一切都没有任何运气。
这个问题是我正在研究的一个更大的触发因素的一部分。孤立来看,这没有多大意义,但说明了问题。
经过多次尝试和错误,我终于弄清楚了。诀窍是复合数据类型的表示法(更重要的是它们的用法),这最终导致我这样做:
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)
| 归档时间: |
|
| 查看次数: |
948 次 |
| 最近记录: |