From: | <dkuroki(at)dbas(dot)com(dot)ar> |
---|---|
To: | "Jose Stragnari" <jose(at)mulleryasociados(dot)com(dot)ar>, "pgsql-es-ayuda(at)postgresql(dot)org" <pgsql-es-ayuda(at)postgresql(dot)org> |
Subject: | Re: Inconsistencia en foreign key |
Date: | 2006-04-17 20:22:36 |
Message-ID: | Qr9e53eH.1145305356.8472790.dkuroki@dbas.com.ar |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-es-ayuda |
Jose,
Postgresql implementa las foreign keys mediante un trigger. Esto es, cada
vez que se hace un insert, update o delete de una tabla con FK, este
trigger ejecuta una funcion interna que "se fija" en la otra tabla si
los datos estan ok.
Por esta razon es que si estas haciendo un trace de los statements (
log_statement=all ) podes ver algunos queries del tipo "SELECT 1 FROM
ONLY tabla". estos queries los ejecuta esta funcion.
Ahora, el tema pasa porque en postgres podes forzar a una tabla a que no
ejecute triggers modificando un dato en la tabla de catalogo pg_class .
el campo en custion es reltriggers.
reltriggers es un valor smallint que responde a la cantidad de triggers
de la tabla. si este valor es 0 para una tabla dada, ningun trigger va a
ser ejecutado, aun los de la foreign key. ( considera que la tabla
pg_class puede ser updateada como cualquier tabla )
verifica ese valor si es correcto, porque de esa forma puede haber
"entrado" un valor inconsistente.
esto puede servir de "artilugio" para tareas tediosas en migraciones
por ejemplo.
espero que sea claro.
Dorian Kuroki
DBAS.
Con fecha 17/4/2006, "Jose Stragnari" <jose(at)mulleryasociados(dot)com(dot)ar>
escribió:
>Hola,
>
>
>
> Quisiera saber si alguna vez a alguno le sucedió que aparezca una inconsistencia con una foreign key como me sucede en este momento. Se trata de dos tablas, userempre que referencia con uno de sus campos a la tabla xrpuser. La referencia es la siguiente:
>
>
>
>ALTER TABLE userempre
>
> ADD CONSTRAINT "FK_userempre_xrpusers" FOREIGN KEY (idxrpuser)
>
> REFERENCES xrpusers (idxrpuser) MATCH SIMPLE
>
> ON UPDATE CASCADE ON DELETE CASCADE;
>
>
>
>El problema lo encuentro en la tabla userempre con un dato (2177) que no tiene su correspondiente registro en la tabla xrpuser. De acuerdo a la documentación de Postgresql no existe la posibilidad como en Oracle de que las constraints tengan diferentes estados (Enable Validate, Enable Novalidate, Disable Validate, Disable Novalidate). En todos los casos posibles para definir la opción ON DELETE de la constraint (NO ACTION, RESTRICT, CASCADE o SET NULL), no encuentro la manera de reproducir este, que a primera vista parece un error. Inclusive al borrar e intentar crear la constraint nuevamente no lo permite, pues este dato viola la restricción.
>
>
>
>No se si estoy pasando por alto algo en relación a las foreign key de postgres, así que si alguien sabe de que se trata le agradecería cualquier aclaración.
>
>
>
>Gracias
>
>
>
>
>
>José Luis Stragnari
>
>jose(at)mulleryasociados(dot)com(dot)ar
>
>Córdoba - Argentina
>
From | Date | Subject | |
---|---|---|---|
Next Message | Bell Mundarain | 2006-04-17 20:53:40 | pool de conexion |
Previous Message | Jose Stragnari | 2006-04-17 19:53:44 | Inconsistencia en foreign key |