2010-06-21 71 views
4

我有一个触发功能对于具有下面的代码片段表测试环路 -PostgreSQL的:是否可以动态地通过一个表的列

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'; 
/* Rest of the codes */ 
................................. 

所以我静态检查与所有列的新值的以前的价值来确保完整性。现在,每当我的业务逻辑发生变化,我必须在该表中添加新列时,每次都必须修改此触发器。我认为这会更好,如果我能动态地检查该表的所有列,而不显式键入他们的名字。

怎么办?

回答

6

看看information_schema,有一个视图“列”。通过结果

SELECT 
    column_name 
FROM 
    information_schema.columns 
WHERE 
    table_schema = TG_TABLE_SCHEMA 
AND 
    table_name = TG_TABLE_NAME; 

环路和你去:执行一个查询,以获得从激发触发器表中所有当前COLUMNNAMES!

更多信息可在fine manual中找到。

8

从9.0β2文档中关于WHEN子句中的触发器,这可能是能够在早期版本触发器主体中使用:

OLD.* IS DISTINCT FROM NEW.*

或可能(from 8.2 release notes

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

+0

是的。如果您所做的只是测试任何列值是否发生了变化,并且您不需要知道已更改的特定列,那么Stephen的第二个片段绝对是您的选择。简洁,从不需要维护! – 2010-06-21 15:28:39

+0

Archangel可能会发现将该测试与“锁定> 0”以及“锁定”是否已更改相结合的知识很有用。另外'IS DISTINCT FROM'处理空值的方式并不像'<>'那么令人惊讶 – 2010-06-21 20:54:18

1

使用pl/perl或pl/python。他们更适合这样的任务。 很多更好。

您还可以安装hstore-new,并使用它的行 - > hstore语义,但这在使用普通数据类型时绝对不是一个好主意。

相关问题