[OT] CREATE RULE en PostgreSQL

Rodrigo Fuentealba darkprox en gmail.com
Vie Jul 14 16:20:26 CLT 2006


Estimados Listeros:

No sé si realmente esto cae en Off-Topic pero por si las moscas...

Estoy desarrollando un sistema en PostgreSQL bajo Linux como base de 
datos. Me he craneado con uno de los requerimientos y la verdad no me 
calza... Tengo un código que reza más o menos así:

CREATE OR REPLACE RULE insertar_cliente AS
    ON insert TO tabla_clientes
    DO ALSO
        UPDATE tabla_clientes
        SET codigo = upper(codigo)
        WHERE new.codigo = codigo;

Esto, lo que hace, es que si inserto un dato en mi tabla de clientes, 
también indique que el código (por requerimientos de la empresa es 
varchar de 4) sea puesto en mayúsculas, para no repetir, y si existe un 
código (por ejemplo PA y pa), al insertar el segundo, falle. El problema 
aquí no está, y si bien no está óptimo (hace el proceso por todos los 
clientes, ya sea que se ingresen en mayúsculas o minúsculas, lo cual 
supone una consulta más) es más que suficiente pues en la empresa para 
la que trabajo se agregan a lo sumo 10 clientes por mes. (Pensando en 
optimizar al máximo el rendimiento).

El problema se presenta al hacer update, pues me deja actualizar 
perfectamente el código 'PA' a 'pa'. Eso cae de cajón, pero:

CREATE OR REPLACE RULE actualizar_cliente AS
    ON update TO tabla_clientes
    DO ALSO
        UPDATE tabla_clientes
        SET codigo = upper(codigo)
        WHERE new.codigo = codigo;

me da un error de redundancia, que al hacer update se generaría otro 
update que a su vez genera otro y... así hasta el infinito. PostgreSQL, 
en todo caso, no permite que ocurra esto. Pero, ¿cómo lo hago para crear 
una regla, función, trigger o demás que complete esa idea de manera 
correcta? Me las he craneado bastante y es uno de esos tópicos que por 
más que busques en google (probé con "create rule" update redundant 
postgresql, y variaciones de éstas) no te vas a pillar fácil.

Mi intención es asegurar esto porque utilizaremos más de un lenguaje en 
el desarrollo del sistema...  Si fuera sólo PHP, no me preocupo y paso 
strtoupper($codigo); pero no confío en otros programadores, y después de 
todo, si PostgreSQL es tan bueno, hay que aprovecharlo... Juan Segura...

BTW: Uso PostgreSQL 8.1.4 bajo Slackware current (sí, también existimos)

¿Any ideas?

--
Rodrigo Fuentealba.


Más información sobre la lista de distribución Linux