Skip site navigation (1) Skip section navigation (2)

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 (view raw or flat)
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


pgsql-es-ayuda by date

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

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group