From: | "Dimas Ayala" <dimasayala(at)gmail(dot)com> |
---|---|
To: | "Postgres Espaniol" <pgsql-es-ayuda(at)postgresql(dot)org> |
Subject: | Posible Bug de Postgres... |
Date: | 2006-10-03 16:32:57 |
Message-ID: | fd8818d50610030932j462e2b97jc219816790088bf2@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-es-ayuda |
Alvaro y Jaime les envio copia porque he enviado este mail varias
veces y no llega.
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
- Hide quoted text -
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
- Hide quoted text -
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
- Hide quoted text -
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.
From | Date | Subject | |
---|---|---|---|
Next Message | Espartano | 2006-10-03 19:10:57 | Re: Obtener historial de Querys |
Previous Message | Rafael De_Linares | 2006-10-03 16:23:44 | ayuda a una duda sql |