rendered paste bodyCREATE 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'