Re: Programación del lado del servidor

From: Chema Cortés <chema(at)ls-l(dot)org>
To: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Programación del lado del servidor
Date: 2005-01-26 14:56:15
Message-ID: 200501261556.16002.chema@ls-l.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

El Lunes, 24 de Enero de 2005 18:10, Juan Pablo Espino escribió:
> Gracias por la respuesta Chema.
>
> Lo que me dices implica que tenga que llamar a la función?, hay forma
> de almacenar un procedimiento que este corriendo siempre en el
> servidor, es decir que no tenga que llamarlo.
>
> Por ejemplo un procedimiento que haga un control de acceso mas
> granular a una tabla, es decir, un usuario x hace un select a una
> tabla, mi procedimiento verifica (en otra tabla por ejemplo) a que
> registros puede accesar ese usuario y solo mostrarle esos a los que
> tiene permiso. Se podria hacer algo asi?, tiene sentido?, gracias
> anticipadas, saludos

Ya te han comentado que para eso que dices lo mejor sería una VIEW/RULE, pero
constestándote más concretamente, los lenguajes procedurales pueden hacer
cualquier tipo de consulta u operación. Por ejemplo, PL/Python tiene el
módulo 'plpy' con el que se puede ejecutar sentencias sql desde cualquier
función.

Por poner un ejemplo, tengo uno, algo complejo, hecho en PL/Python que emplea
un generador de fibonacci:

CREATE TABLE prueba (id integer, nombre text);

-- Generador de números de fibonacci
CREATE FUNCTION fibgen() RETURNS integer AS '
r=plpy.execute("select id from prueba order by id desc limit 2" )

if len(r)==2:
a,b=r[1]["id"],r[0]["id"]
elif len(r)==1:
a,b=r[0]["id"],0
else:
a,b=1,0

return a+b'
LANGUAGE 'plpythonu';

-- Asignar el secuenciador
ALTER TABLE prueba
ALTER COLUMN id SET DEFAULT fibgen();

-- Algunas inserciones
INSERT INTO prueba(nombre) VALUES ('Primero');
INSERT INTO prueba(nombre) VALUES ('Segundo');
INSERT INTO prueba(nombre) VALUES ('Tercero');
INSERT INTO prueba(nombre) VALUES ('Cuarto');
SELECT * FROM prueba;

-- id | nombre
-- ----+---------
-- 1 | Primero
-- 1 | Segundo
-- 2 | Tercero
-- 3 | Cuarto
-- (4 filas)

INSERT INTO prueba(id,nombre) VALUES(100,'Cien');
INSERT INTO prueba(nombre) VALUES('CienUno');
INSERT INTO prueba(nombre) VALUES('CienDos');
SELECT * FROM prueba;

-- id | nombre
-- ----+---------
-- 1 | Primero
-- 1 | Segundo
-- 2 | Tercero
-- 3 | Cuarto
-- 100 | Cien
-- 103 | CienUno
-- 203 | CienDos
-- (7 filas)

PD: Mi anterior cuenta cascó justamente antes de enviar este mensaje, de ahí
que pido disculpas si este mensaje llega tarde ó duplicado.

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Jaime Casanova 2005-01-26 15:18:56 Re: Sobre instalacion de postgres
Previous Message Cristofer N. Reyes A. 2005-01-26 14:45:26 Re: Sobre dato SERIAL