2013-10-07 35 views
2

如何獲取觸發器函數中的所有列名及其值,因爲我需要在插入表之前驗證所有列值。我已經嘗試了下面的代碼。如果我們知道列名字的意思是,我們可以通過觸發功能使用NEW對象輕鬆獲得價值NEW.myColumnName。但在這裏,我需要動態獲取列名...在postgresql中使用觸發函數獲取表中的所有列名稱

CREATE FUNCTION insert_update_validate() RETURNS TRIGGER AS $$ 
    DECLARE 
    BEGIN 
    FOR i IN 0..(TG_ARGV-1) LOOP 
     IF TG_ARGV[i] IS NULL THEN     
       RAISE EXCEPTION 'cannot have null VALUE', NEW.TG_ARGV[i]; 
    END LOOP; 
    RETURN NEW; 
    END; 
    $$ LANGUAGE plpgsql; 

回答

2

由於hstore是PostgreSQL的一部分,鑄造row到hstore是迭代其列的主要方法,至少在plpgsql上下文中。否則,作爲一種語言,它不提供任何構造來從行中提取列名。

基本上它是關於迭代each(store(NEW))。以下是您可以使用的骨架:

CREATE FUNCTION insert_update_validate() RETURNS TRIGGER AS $$ 
DECLARE 
k text; 
v text; 
BEGIN 
    FOR k,v IN select key,value from each(hstore(NEW)) LOOP 
    if v is null then 
     raise exception 'value is null for column %', k; 
    end if; 
    END LOOP; 
    RETURN NEW; 
END; 
$$ LANGUAGE plpgsql; 
相關問題