[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