Re: Ejecución automática por tiempo de procedimientos.

From: Gunnar Wolf <gwolf(at)gwolf(dot)org>
To: Pablo Braulio <brulics(at)gmail(dot)com>
Cc: Alvaro Herrera <alvherre(at)alvh(dot)no-ip(dot)org>, pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Ejecución automática por tiempo de procedimientos.
Date: 2007-12-11 15:42:30
Message-ID: 20071211154230.GD23366@cajita.gateway.2wire.net
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Pablo Braulio dijo [Tue, Dec 11, 2007 at 01:43:21PM +0100]:
> Me parece buena idea lo que dices de la hora, pero no entiendo con lo
> que dices de la sesión.
>
> Hay que tener en cuenta que he creado una tabla de usuarios, no estoy
> usando los usuarios de postgres para que los usuarios se autentiquen.
>
> Sólo hay un usuario que es con el cual se hace la conexión a la base de
> datos antes de hacer los querys.
>
> De todos modos, mi pregunta es sobre si se puede ejecutar el
> procedimiento diseñado cada determinado tiempo.

¿Permites una sóla sesión por usuario, o varias? Bueno, te muestro acá
lo que yo haría para una sóla - extenderlo es trivial (y recomendable)
;-)

CREATE TABLE usuario (
id serial PRIMARY KEY,
login text NOT NULL UNIQUE,
passwd char(32) NOT NULL,
nombre text,
sesion char(32),
sesion_inicio timestamp default now()
);

Te conviene crear un índice sobre el campo sesion, pues estaremos
haciendo búsquedas sobre de él. A este campo y a passwd le pongo una
longitud fija (no son text como los demás), porque guardo ahí la
salida de md5, que es siempre de 32 caracteres. Tu implementación
puede variar.

Puedes tener una tabla con la configuración del sistema, por ejemplo,
para poder ajustar la duración de tus sesiones - por ahora, lo
limitamos a 10 minutos en duro.

Ahora, en vez de intentar validar la sesión del usuario desde tu PHP,
mejor llama a la función sesion_valida() - No va probada, pero es algo
como esto:

CREATE OR REPLACE FUNCTION sesion_valida(text) RETURNS integer AS
$$
DECLARE
la_sesion ALIAS FOR $1;
duracion interval;
user_id integer;
BEGIN
duracion = '10 min'::interval
-- Antes de otra cosa, vaciamos todas las sesiones expiradas
UPDATE usuario SET sesion=NULL WHERE sesion_inicio+duracion < now();
-- Buscamos a qué usuario pertenece esta sesión
SELECT INTO user_id id FROM usuario WHERE sesion = la_sesion;
RETURN la_sesion;
END;
$$ LANGUAGE 'plpgsql';

¿Te gusta? Claro está, es _mucho_ más eficiente (especialmente si
tienes cantidades grandes de usuarios) que crees una tabla
independiente para sesiones. Pero bueno, ahí ya te resolví la tarea de
cómo permitir más de una sesión por usuario. Claro, queda otra (muy
trivial) de cómo limitarlo ;-)

Saludos,

--
Gunnar Wolf - gwolf(at)gwolf(dot)org - (+52-55)5623-0154 / 1451-2244
PGP key 1024D/8BB527AF 2001-10-23
Fingerprint: 0C79 D2D1 2C4E 9CE4 5973 F800 D80E F35A 8BB5 27AF

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message James Alonso Barrientos Santos 2007-12-11 16:44:46 Error al crear BD en una transaccion
Previous Message Conrado Blasetti 2007-12-11 13:40:53 Instalar xml en Win