2016-04-18 7 views
1

Ich habe einen Trigger in PostgreSQLPostgreSQL: Vergleichen NULL und Normalwert

CREATE OR REPLACE FUNCTION table_update_func_pk1() RETURNS trigger AS $$ 
DECLARE 
    ri RECORD; 
    old_value TEXT; 
    new_value TEXT; 
BEGIN 
    FOR ri IN 
     SELECT column_name FROM information_schema.columns 
     WHERE 
      table_schema = quote_ident('public') 
     AND table_name = quote_ident(TG_TABLE_NAME) 
     ORDER BY ordinal_position 
    LOOP 
     EXECUTE 'SELECT ($1).' || ri.column_name || '::text' INTO new_value USING NEW; 
     EXECUTE 'SELECT ($1).' || ri.column_name || '::text' INTO old_value USING OLD; 

     IF new_value <> old_value AND ri.column_name != 'update_by' THEN 
      INSERT INTO protokoll(datetime, operation, tabelle, field, pk1, old_value, new_value, update_by) 
        VALUES(now(), TG_OP, TG_TABLE_NAME, ri.column_name, NEW.cfg, old_value, new_value, NEW.update_by); 
     END IF; 
    END LOOP; 
    RETURN NEW; 
END; 
$$ LANGUAGE plpgsql; 

Manchmal, wenn old_value von NULL auf dem Normalwert (oder von dem Normalwert auf NULL) geändert wird, die Bedingung "new_value <> old_value" ist nicht wahr, aber unbekannt. Ich würde gerne fragen, es gibt eine Methode, die ich in diesem Fall verwirklichen kann. Vielen Dank.

Antwort

3

Verwendung is distinct from:

if new_value IS DISTINCT FROM old_value and ri.column_name <> 'update_by' then 
    ... 
end if;