Buenos días.
Seguimos con el inconveniente en la actualización de las tablas del esquema toba_mapuche, que en el caso de utilizarse membresías, da error.
El instalador/actualizador realiza los siguientes pasos:
-
Delete/borrado del contenido de todas las tablas en donde el usuario define la estructura de accesos de los usuarios, en el orden de la integridad referencial .
Se copia a continuación parte del log del motor postgres. Se detecta un primer error: ejecuta cada sentencia DELETE dos veces para algunas tablas, innecesariamente.
…
DELETE FROM apex_restriccion_funcional_evt WHERE proyecto = ‘mapuche’ AND restriccion_funcional IN (SELECT res.restriccion_funcional FROM apex_restriccion_funcional AS res WHERE res.proyecto = ‘mapuche’ AND res.permite_edicion = 1);
DELETE FROM apex_restriccion_funcional_evt WHERE proyecto = ‘mapuche’ AND restriccion_funcional IN (SELECT res.restriccion_funcional FROM apex_restriccion_funcional AS res WHERE res.proyecto = ‘mapuche’ AND res.permite_edicion = 1);
DELETE FROM apex_restriccion_funcional_ei WHERE proyecto = ‘mapuche’ AND restriccion_funcional IN (SELECT res.restriccion_funcional FROM apex_restriccion_funcional AS res WHERE res.proyecto = ‘mapuche’ AND res.permite_edicion = 1);
DELETE FROM apex_restriccion_funcional_ei WHERE proyecto = ‘mapuche’ AND restriccion_funcional IN (SELECT res.restriccion_funcional FROM apex_restriccion_funcional AS res WHERE res.proyecto = ‘mapuche’ AND res.permite_edicion = 1);
DELETE FROM apex_restriccion_funcional_ef WHERE proyecto = ‘mapuche’ AND restriccion_funcional IN (SELECT res.restriccion_funcional FROM apex_restriccion_funcional AS res WHERE res.proyecto = ‘mapuche’ AND res.permite_edicion = 1);
DELETE FROM apex_restriccion_funcional_ef WHERE proyecto = ‘mapuche’ AND restriccion_funcional IN (SELECT res.restriccion_funcional FROM apex_restriccion_funcional AS res WHERE res.proyecto = ‘mapuche’ AND res.permite_edicion = 1);
DELETE FROM apex_restriccion_funcional_cols WHERE proyecto = ‘mapuche’ AND restriccion_funcional IN (SELECT res.restriccion_funcional FROM apex_restriccion_funcional AS res WHERE res.proyecto = ‘mapuche’ AND res.permite_edicion = 1);
DELETE FROM apex_restriccion_funcional_cols WHERE proyecto = ‘mapuche’ AND restriccion_funcional IN (SELECT res.restriccion_funcional FROM apex_restriccion_funcional AS res WHERE res.proyecto = ‘mapuche’ AND res.permite_edicion = 1);
DELETE FROM apex_restriccion_funcional WHERE proyecto = ‘mapuche’ AND restriccion_funcional IN (SELECT res.restriccion_funcional FROM apex_restriccion_funcional AS res WHERE res.proyecto = ‘mapuche’ AND res.permite_edicion = 1);
DELETE FROM apex_restriccion_funcional WHERE proyecto = ‘mapuche’ AND restriccion_funcional IN (SELECT res.restriccion_funcional FROM apex_restriccion_funcional AS res WHERE res.proyecto = ‘mapuche’ AND res.permite_edicion = 1); -
Insert en apex_restriccion_funcional de todas las restricciones.
-
Insert en apex_restriccion_funcional_evt de todos los eventos de todas las restricciones del punto 2.
-
Insert en apex_restriccion_funcional_ei de todos los ítems de todas las restricciones del punto 2.
-
Insert en apex_restriccion_funcional_ef de todos los formularios de todas las restricciones del punto 2.
-
Insert en apex_restriccion_funcional_pantalla de todas las pantallas de todas las restricciones del punto 2.
La lógica de inserción del instalador/actualizador cambia para las siguientes tablas, en donde por cada registro de apex_usuario_grupo_acc, que representa a un perfil funcional, inserta los ítems relacionados en apex_usuario_grupo_acc_item, los miembros (membresía) en apex_usuario_grupo_acc_miembros, si es que existen y en apex_grupo_acc_restriccion_funcional las restricciones asociadas, si es que existen, todo en ese orden.
En nuestro caso, tenemos por ejemplo, perfiles funcionales que tienen solo miembros, y éstos a su vez son también perfiles, (tienen que existir en apex_usuario_grupo_acc) y poseen sus respectivos ítems; perfiles funcionales que solo son restricciones, y también pueden darse distintas combinaciones.
Cuando se actualiza este tipo de árbol, el instalador/actualizador, al proceder a insertar todos los miembros, se encuentra con que éstos todavía no fueron insertados como perfiles funcionales, y da ERROR. Para ello ordena los registros de la tabla apex_usuario_grupo_acc por la columna “usuario_grupo_acc”.Pero de existir miembros, todos ellos son a su vez perfiles funcionales, por lo que lo más lógico sería primero insertar todos los perfiles funcionales, sus ítems si los tiene y sus restricciones si las tiene, y luego, en último lugar, los miembros. Esta es la secuencia de inserción que tienen las tablas según el comportamiento de la aplicación y esa misma secuencia debería respetar el instalador/actualizador. (Es decir, no se puede agregar un miembro a un perfil, si éste todavía no fue dado de alta como perfil). Adoptar un criterio que revierte la integridad referencial, es lo que da orígen a errores.
Nos vemos obligados a establecer y controlar un orden forzado, por fuera, que no sería necesario, dado que esto le agrega a la definición de perfiles desde la aplicación una complejidad extra, porque hay que estar recordando en el momento de efectuar las altas, qué prefijo colocar, dependiendo de qué se trata, dado que desde la aplicación esa columna no se puede consultar ni se muestra en ninguna pantalla. Además esto le quita flexibilidad, porque de tener que incorporar otro tipo de combinatoria, posiblemente habría que redefinir el orden. Adjuntamos un ejemplo donde forzamos el orden, pero consideramos que no es la solución, dado que estamos trabajando constantemente con los perfiles, y esto implica tener que llevar un control por fuera de la aplicación.
Como le mencionamos a Emiliano Jaureguiber, “no estamos solicitando una mejora, sino la corrección de un error”.Obviamente no conocemos el código específicamente, pero esta corrección implicaría algo sencillo. Sería insertar todos los registros en apex_usuario_grupo_acc de una sola vez. No se si queda claro que no se trata de un orden, es lógica. Integridad referencial básica." El nos sugirió ingresar el tema por el foro.
Aguardamos sus comentarios.
Gracias.
Atte.
Graciela Piccininno
perfilesymembresias.txt (17.3 KB)