是否可以动态循环表的列?

MD *_*med 5 postgresql plpgsql database-trigger

我有一个表测试的触发器函数,它具有以下代码片段:

IF TG_OP='UPDATE' THEN
    IF OLD.locked > 0 AND
 (       OLD.org_id <> NEW.org_id OR
            OLD.document_code <> NEW.document_code OR
            -- other columns ...
 )
THEN
    RAISE EXCEPTION 'Message';
-- more code
Run Code Online (Sandbox Code Playgroud)

所以我静态检查所有列的新值及其先前的值以确保完整性.现在,每当我的业务逻辑发生变化并且我必须在该表中添加新列时,我每次都必须修改此触发器.我认为如果不知何故我可以动态检查该表的所有列,而不显式输入其名称会更好.

怎么做到呢?

Ste*_*nne 8

从9.0 beta2文档中关于WHEN触发器中的子句,它可以在触发器体内的早期版本中使用:

OLD.* IS DISTINCT FROM NEW.*

或者可能(来自8.2发行说明)

IF row(new.*) IS DISTINCT FROM row(old.*)


Fra*_*ens 7

看一下information_schema,有一个视图"列".执行查询以从触发触发器的表中获取所有当前列名:

SELECT 
    column_name 
FROM 
    information_schema.columns 
WHERE 
    table_schema = TG_TABLE_SCHEMA 
AND 
    table_name = TG_TABLE_NAME;
Run Code Online (Sandbox Code Playgroud)

循环结果,你去!

更多信息可以在精细手册中找到.