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.
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 |