Fwd: Error en datos posible Bug de la DB

From: "Dimas Ayala" <dimasayala(at)gmail(dot)com>
To: "Postgres Espaniol" <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Fwd: Error en datos posible Bug de la DB
Date: 2006-10-03 15:22:12
Message-ID: fd8818d50610030822t745a0070me6a31b1da8c7153a@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Tengo un servidor postgres 8.1.3 sobre fedora CORE 3

He obserbado en un par de ocaciones que la informacion de un par de
registros a cambiado de una manera extrana.
Ademas tengo activado el LOG parar que registre todos las modificaciones a
los datos. el log esta en modo mod.

tengo una tabla llamada ccdocum que es donde guardo las facturas y los
creditos fiscales: Esta tiene una campo llamado saldo que tiene una regla
CHECK para que no pueda ser menor de cero

CREATE TABLE "cpcobrar"."ccdocum" (
"idemp" CHAR(2) NOT NULL,
"idpedv" CHAR(9) DEFAULT '000000000'::bpchar NOT NULL,
"idtipdoc" CHAR(2) NOT NULL,
"iddocum" CHAR(9) DEFAULT ' '::bpchar NOT NULL,
"fecha" DATE,
"idcliente" CHAR(6) NOT NULL,
"nomclie" CHAR(50) DEFAULT ' '::bpchar NOT NULL,
"nreg" CHAR(10) DEFAULT ' '::bpchar NOT NULL,
"nit" CHAR(17) DEFAULT ' '::bpchar NOT NULL,
"valor" NUMERIC(16,4) DEFAULT 0.0000 NOT NULL,
"iva" NUMERIC(16,4) DEFAULT 0.0000 NOT NULL,
"total" NUMERIC(16,4) DEFAULT 0.0000 NOT NULL,
"saldo" NUMERIC(16,4) DEFAULT 0.0000 NOT NULL,
"pag" CHAR(1) DEFAULT 'N'::bpchar NOT NULL,
"incluida" CHAR(1) DEFAULT 'Y'::bpchar NOT NULL,
"cerrada" CHAR(1) DEFAULT 'N'::bpchar NOT NULL,
"cmes" CHAR(1) DEFAULT 'N'::bpchar NOT NULL,
"idrutad" CHAR(9) DEFAULT '000000000'::bpchar NOT NULL,
"origen" CHAR(1) DEFAULT 'V'::bpchar NOT NULL,
"descrip" TEXT DEFAULT ' '::text,
"idfolio" SMALLINT DEFAULT 0 NOT NULL,
"iva2" NUMERIC(16,4) DEFAULT 0.000,
CONSTRAINT "ccdocum_pk_iddocum" PRIMARY KEY("idemp", "idfolio",
"idtipdoc", "iddocum"),
CONSTRAINT "ccdocum_chk_saldo" CHECK (saldo >= (0)::numeric),
CONSTRAINT "ccdocum_fk_idfolio" FOREIGN KEY ("idemp", "idfolio")
REFERENCES "cpcobrar"."ccfolios"("idemp", "idfolio")
ON DELETE NO ACTION
ON UPDATE NO ACTION
NOT DEFERRABLE,
CONSTRAINT "ccdocum_idx_idcliente" FOREIGN KEY ("idemp", "idcliente")
REFERENCES "cpcobrar"."ccmclientes"("idemp", "idcliente")
ON DELETE RESTRICT
ON UPDATE CASCADE
NOT DEFERRABLE,
CONSTRAINT "ccdocum_idx_idrutad" FOREIGN KEY ("idemp", "idrutad")
REFERENCES "cpcobrar"."ccrutad"("idemp", "idrutad")
ON DELETE RESTRICT
ON UPDATE CASCADE
NOT DEFERRABLE
) WITHOUT OIDS;

Y otra llamada ccabonode que registra cada uno de los abono realizados para
una factura. La cual tiene un triger que se dispara cuando se inserta,
actualiza o elimina un registro de ccabonode.. Este triger lo que hace es
afectar la columna saldo de ccdocum. Ahumentandola o disminullendola

CREATE TABLE "cpcobrar"."ccabonode" (
"idemp" CHAR(2) DEFAULT '00'::bpchar NOT NULL,
"idtipabo" CHAR(2) DEFAULT '00'::bpchar NOT NULL,
"idfolioabo" SMALLINT DEFAULT 0 NOT NULL,
"idabono" CHAR(9) DEFAULT '000000000'::bpchar NOT NULL,
"idtipdoc" CHAR(2) DEFAULT '00'::bpchar NOT NULL,
"iddocum" CHAR(9) DEFAULT '000000000'::bpchar NOT NULL,
"abono" NUMERIC(16,4) DEFAULT 0.0000 NOT NULL,
"idfolio" SMALLINT DEFAULT 0,
CONSTRAINT "ccabonode_fk_abono" FOREIGN KEY ("idemp", "idfolioabo",
"idtipabo", "idabono")
REFERENCES "cpcobrar"."ccabonoen"("idemp", "idfolio", "idtipabo",
"idabono")
ON DELETE CASCADE
ON UPDATE CASCADE
NOT DEFERRABLE,
CONSTRAINT "ccabonode_fk_iddocum" FOREIGN KEY ("idemp", "idfolio",
"idtipdoc", "iddocum")
REFERENCES "cpcobrar"."ccdocum"("idemp", "idfolio", "idtipdoc",
"iddocum")
ON DELETE RESTRICT
ON UPDATE CASCADE
NOT DEFERRABLE
) WITHOUT OIDS;

CREATE TRIGGER "ccabonode_tr_act_saldo_factura" BEFORE INSERT OR UPDATE OR
DELETE
ON "cpcobrar"."ccabonode" FOR EACH ROW
EXECUTE PROCEDURE "cpcobrar"."ccabonode_tgf_act_saldo_factura"();

Codigo del trigger...
CREATE OR REPLACE FUNCTION "cpcobrar"."ccabonode_tgf_act_saldo_factura" ()
RETURNS trigger AS
$body$
begin
//Si es eliminacion de registro ahumenta el valor de la columna
ccdocum.saldo con ccabonode.abono
IF (TG_OP = 'DELETE') THEN
IF OLD.abono !=0 then
UPDATE "cpcobrar"."ccdocum"
SET saldo = saldo + OLD.abono
WHERE idemp=OLD.idemp and idtipdoc=OLD.idtipdoc and
idfolio=OLD.idfolio and iddocum=OLD.iddocum;
END IF;
RETURN OLD;

//Si actualiza el registro ahumenta o disminuye el valor de la columna
ccdocum.saldo con la diferencia del new.ccabonode.abono -
old.ccabonode.abono
ELSIF (TG_OP = 'UPDATE') THEN
IF NEW.abono != OLD.abono THEN
UPDATE "cpcobrar"."ccdocum"
SET saldo = saldo - (NEW.abono - OLD.abono)
WHERE idemp=NEW.idemp and idtipdoc=NEW.idtipdoc and
idfolio= NEW.idfolio and iddocum=NEW.iddocum;
END IF;
RETURN NEW;

//Si inserta el registro disminuye el valor de la columna ccdocum.saldo con
el valor de new.ccabonode.abono
ELSIF (TG_OP = 'INSERT') THEN
IF NEW.abono!=0.0000 THEN
UPDATE "cpcobrar"."ccdocum"
SET saldo = saldo - NEW.abono
WHERE idemp=NEW.idemp and idtipdoc=NEW.idtipdoc and
idfolio=NEW.idfolio and iddocum=NEW.iddocum;
END IF;
RETURN NEW;
END IF;
end;
$body$
LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;

El detalle es que en abonode tenia un registro apuntado a una factura...
Pero el log dice lo siguiente:

INSERT INTO cpcobrar.ccabonode VALUES
('01','06','7','000121718','CR','000001875','2166.00','7')

Pero en la tabla tenia:
'01','06','7','000121718','CR','000001591','2166.00','7'

Cuando el documento 1591 su valor es de 549.00

Y en el log no se registra ningun update sobre ccaconode para que cambiara
de numero de factura. Ademas cuando cambio de numero el update ubiera
disparado el triger y habrua hecho que el saldo de la factura fuera menor de
0 y el CHECK tendira que haber abortado la actualizacion.

Cualquier ayuda sera bien benida.
Si hay que hacer un estudio sobre el caso. tienen todo mi apoyo para
investigar que pudo causar este extraño comportamiento. Adios

Tengo todos los log de la base de datos desde el 8 de junio de 2006. Y los
movimientos son de agosto..

Espero haber dado a esplicar. Gracias.

In response to

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Linder Poclaba 2006-10-03 15:29:58 Re: Problem with postgresql 8.1 and java/ Problema con postgresql 8.1 y java
Previous Message Pablo Braulio 2006-10-03 14:29:21 Re: Obtener historial de Querys