Re: xid a integer

From: Mximo Eduardo Mndez <mmendez(at)ceride(dot)gov(dot)ar>
To: "Alvaro Herrera" <alvherre(at)alvh(dot)no-ip(dot)org>
Cc: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: xid a integer
Date: 2005-07-29 09:54:31
Message-ID: BasiliX-1.1.1_fix2-112264167142ea27070f6e8@wwwmail.ceride.gov.ar
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

28 Jul 2005 19:49 ART usted escribio:

> On Thu, Jul 28, 2005 at 05:40:23PM 0000, Mximo Eduardo Mndez wrote:
> > Buenas tardes. En un triggers estoy obteniendo el id de la
> > transaccin activa y lo guardo en una columna de tipo integer de la
> > misma tabla del trigger. Ahora bien, necesito eliminar filas de la
> > misma tabla, pero con la condicin que la transaccin almacenada no
> > est activa actualmente, algo as como:
>
> Por que no creaste la columna con tipo xid?
>

OK, cambi el tipo de dato (lo haba dejado as porque antes tomaba el proceso activo en esa columna integer y con eso no me alcanz), pero sigo teniendo incovenientes a la hora de hacer comparaciones con un IN. Brindo ms explicaciones para aclarar lo que quiero hacer. Estoy trabajando con java/jboss/hibernate y postgres. La auditora no la pondr en la capa de negocios sino en la base de datos implementada mediante triggers. Como desde la base de datos, el usuario siempre es el mismo, no puedo identificar quien es el que me est haciendo alguna modificacin en cualquier tabla, en consecuencia hago un truquito. Cuando se ejecuta una transaccin, fuerzo un insert en una tabla con la siguiente estructura:

pgjboss (proceso xid, usuario char(8))

proporcionndole el nombre del usuario del jboss en la columna usuario. Esta tabla tiene un trigger de insert que inicialmente recuperaba el proceso al que se corresponda mediante pg_backend_pid() y de esta manera, al conocer este dato, todas las operaciones que se hagan en la base, tienen acceso al usuario ya grabado en primera instancia. Pero con esto no me alcanz, porque el jboss me tomaba la misma conexin para otro usuario que se conectaba (a pesar de tener un pool para elegir), de este modo aunque conoca id de proceso no me era suficiente. Por este motivo, intent determinar el id de transaccin que ese s sera nico. Bien, el trigger lo detecta, pero pretendo adems ir limpiando la tabla anterior, eliminando las filas del usuario jboss conectado de transacciones anteriores que ya no estn activas. La funcin del trigger es la siguiente:

CREATE OR REPLACE FUNCTION usrpgjboss() RETURNS trigger AS $usrpgjboss$
BEGIN
DELETE FROM pgjboss WHERE usuario = NEW.usuario AND proceso NOT IN (SELECT l."x" FROM pg_lock_status() l(relation oid, "db" oid, "x" xid, pid integer, "md" text, granted boolean));
SELECT l."x" INTO NEW.proceso FROM pg_lock_status() l(relation oid, "db" oid, "x" xid, pid integer, "md" text, granted boolean) WHERE l.relation IS NULL AND pid = pg_backend_pid();
RETURN NEW;
END;
$usrpgjboss$ LANGUAGE plpgsql;

Supongamos que la tabla pgjboss tiene los siguientes datos:

proceso | usuario
--------------------
74052 pepe
74063 carlos

Si el usuario 'pepe' inicia una transaccin, en la tabla se registrara el ingreso y adems se debera eliminar la fila de

74052 pepe

y todas las otras de "pepe", pero si NO estn activas. Por eso uso en el trigger:

DELETE FROM pgjboss WHERE usuario = NEW.usuario AND proceso NOT IN (SELECT l."x" FROM pg_lock_status() l(relation oid, "db" oid, "x" xid, pid integer, "md" text, granted boolean));

o bien

DELETE FROM pgjboss WHERE usuario = NEW.usuario AND proceso NOT IN (SELECT transaction FROM pg_locks);

Mi problema ahora es que no borra nada. He probado la SELECT de la consulta y a pesar que pg_locks no tiene ese nmero de transaccin activa, no me lo dice y en consecuencia no la elimina.

Muchas gracias lvaro y a todos por su tiempo.

Mximo E. Mndez
CERIDE

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Mximo Eduardo Mndez 2005-07-29 10:59:52 RE: Bloquear registros
Previous Message Juanky Moral 2005-07-29 08:17:16 Re: Alterar el tipo dato de una Tabla.