All pastes #1026295 Raw Edit

Anonymous

public sql v1 · immutable
#1026295 ·published 2008-05-22 20:34 UTC
rendered paste body
CREATE OR REPLACE FUNCTION crear_auditoria(esquema varchar, tabla varchar) RETURNS void AS$BODY$DECLAREcampos CURSOR FOR SELECT column_name, data_type                                  FROM information_schema.columns                                   WHERE table_schema = esquema                                     AND table_name = tabla;campo VARCHAR;tipo VARCHAR;funcion VARCHAR;auditoria_crear VARCHAR;auditoria_modificar VARCHAR;auditoria_eliminar VARCHAR;BEGIN  OPEN campos;  FETCH campos INTO campo,tipo;  auditoria_crear := '';  auditoria_modificar := '';  auditoria_eliminar := '';    WHILE FOUND LOOP    auditoria_crear := auditoria_crear || ' insert into auditoria(nombre_esquema,nombre_tabla,id_campo,nombre_campo,valor_anterior,valor_nuevo,fecha_operacion,tipo_operacion)                                             values( ''' || esquema ||''' ,''' || tabla || ''', NEW.id , ''' || campo || ''', null, NEW.'|| campo  || ', current_timestamp, ''i'');';    auditoria_modificar := auditoria_modificar || 'IF (OLD.' || campo || ' <> NEW.' || campo || ') THEN                    insert into auditoria(nombre_esquema,nombre_tabla,id_campo,nombre_campo,valor_anterior,valor_nuevo,fecha_operacion,tipo_operacion)                    values( '''|| esquema ||''','''|| tabla || ''', OLD.id , '''|| campo ||''', OLD.'|| campo ||', NEW.'|| campo ||', current_timestamp, ''u'');                END IF;';    auditoria_eliminar := auditoria_eliminar || ' insert into auditoria(nombre_esquema,nombre_tabla,id_campo,nombre_campo,valor_anterior,valor_nuevo,fecha_operacion,tipo_operacion)                                             values( ''' || esquema || ''',''' || tabla ||''', OLD.id , null, null, null, current_timestamp, ''d'');';                        FETCH campos INTO campo,tipo;  END LOOP;    CLOSE campos;  funcion := 'CREATE OR REPLACE FUNCTION ' || esquema || '.' || esquema || '_' || tabla || '_auditor() RETURNS "trigger"    AS $$    BEGIN      IF (TG_OP = ''INSERT'') THEN '       || auditoria_crear || '         RETURN NEW;      END IF;      IF (TG_OP = ''UPDATE'') THEN '       || auditoria_modificar || '         RETURN NEW;      END IF;      IF (TG_OP = ''DELETE'') THEN '       || auditoria_eliminar || '         RETURN OLD;      END IF;    END;    $$ LANGUAGE ''plpgsql''';  RAISE NOTICE '%', funcion;  EXECUTE funcion;  EXECUTE 'CREATE TRIGGER ' || esquema || '_' || tabla || '_auditor            BEFORE INSERT OR UPDATE OR DELETE            ON ' || esquema || '.' || tabla || '            FOR EACH ROW            EXECUTE PROCEDURE ' || esquema || '_' || tabla || '_auditor();';END;$BODY$LANGUAGE 'plpgsql'