[Pgsql-ayuda] Función validadora tal vez demasiado ambiciosa

From: Gunnar Wolf <gwolf(at)gwolf(dot)cx>
To: pgsql-ayuda(at)tlali(dot)iztacala(dot)unam(dot)mx
Subject: [Pgsql-ayuda] Función validadora tal vez demasiado ambiciosa
Date: 2003-06-16 22:44:34
Message-ID: 20030616224434.GK24789@gwolf.cx
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Hola,

Estoy atorado con una idea que tuve, espero que me puedan echar una
mano. Estoy participando en la creación de un sistema para manejo de
congresos que espero pueda ser muy adecuable para las necesidades de
quien se lo encuentre. Tengo una duda que no encuentro por dónde
pegarle - Uso este correo un poco para pensar en voz alta, un poco para
pedir su ayuda:

En mi esquema estoy definiendo ciertos campos como completamente
opcionales (por ejemplo, la organización y departamento a que pertenece
una persona) y ciertos campos como completamente requeridos (por
ejemplo, el nombre propio de una persona). Los campos opcionales deben
aceptar valores NULL.

Hay, sin embargo, otros campos que dependiendo de la configuración serán
obligatorias o no - Por ejemplo, el email. Para ciertos congresos es
información indispensable, mientras que para otros no.

Tengo una tabla donde guardo la información de configuración de mi BD,
que es:

CREATE TABLE config (
name text PRIMARY KEY,
value text NOT NULL
);

Mi idea original era configurar cuándo permito nulos más o menos de esta manera:

INSERT INTO config (name, value) VALUES ('person.email.allow_null','1');

y controlar por medio de una función invocada por trigger cada uno de
los campos configurables.

Esta tal vez sería una idea bonita, pero muy cara - Imaginemos que en la
tabla person haya 5 campos configurables - cada INSERT o UPDATE
implicaría un costo de cinco SELECTs adicionales.

Por otro lado se me ocurre hacer una función que modifique a la tabla
misma, aunque tengo que echarle un poco de coco... Esto reemplazaría a
mi hipotético person.email.allow_null por algo así:

SELECT allow_null_values('person','email',1);

Esto de algún modo transformaría sus parámetros en un:

ALTER TABLE person ALTER COLUMN email DROP NOT NULL;

De este modo me evito una gran cantidad de triggers. De hecho, esta
segunda opción se me hace más elegante... Pero como sea - ¿Qué les
parece? ¿Qué opinan?

Otra: ¿Se les ocurre alguna manera de convertir una cadena 'person' en
el identificador de la tabla person? Digo, la función podría ser una
cantidad tremenda de IFs anidados:
IF table = 'person' THEN
IF field = 'email' THEN
IF null_ok THEN
ALTER TABLE person ALTER COLUMN email DROP NOT NULL;
ELSE
ALTER TABLE person ALTER COLUMN email SET NOT NULL;
END IF;
ELSE IF field = 'birth' THEN
IF null_ok THEN
ALTER TABLE person ALTER COLUMN birth DROP NOT NULL;
ELSE
ALTER TABLE person ALTER COLUMN birth SET NOT NULL;
END IF;
(...)

Muchas gracias :)

--
Gunnar Wolf - gwolf(at)gwolf(dot)cx - (+52-55)5630-9700 ext. 1366
PGP key 1024D/8BB527AF 2001-10-23
Fingerprint: 0C79 D2D1 2C4E 9CE4 5973 F800 D80E F35A 8BB5 27AF

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Victor R. Ruiz 2003-06-16 22:57:11 Re: [Pgsql-ayuda] PostgreSQL!!.. por qNO MySQL???
Previous Message Jose Antonio Galicia 2003-06-16 22:44:02 Re: [Pgsql-ayuda] Función validadora tal vez demasiado ambiciosa