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

Gunnar Wolf gwolf@gwolf.cx
Mon, 16 Jun 2003 17:44:34 -0500


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