Importar datos SQL en DigitalWall (xabet)
El archivo renewables2023_clean.sql usa únicamente sentencias COPY ... FROM stdin. No contiene TRUNCATEs ni resets de secuencias. Importarlo directamente falla por violaciones de UNIQUE constraints (los usuarios admin y xabet ya existen en la DB con IDs distintos).
El problema
El dump SQL tiene este orden de COPYs que viola dependencias FK:
aggregate_variable→ se importa antes quevariable(su FK)authority→ se importa antes queuser(su FK)
Además, los IDs de admin/xabet en el dump (4 y 8) difieren de los que ya existen en la DB (1 y 2), causando conflicto en el UNIQUE constraint de username.
Procedimiento correcto
STEP 1 — Guardar el hash de contraseña del admin actual
DOCKER_HOST=unix:///var/run/docker.sock docker exec postgres_ psql -U dwall -d dwall -tA \
-c "SELECT password FROM \"user\" WHERE username = 'admin';"Copia el hash resultante (formato $2a$10$...). Lo necesitarás en el Step 2.
STEP 2 — Importar con un único comando encadenado
Sustituye <HASH_GUARDADO> por el hash del Step 1:
{
echo "SET session_replication_role = 'replica';"
echo "TRUNCATE TABLE acl_entry, acl_object_identity, acl_sid, acl_class, authority, group_user, user_session, \"group\", query, tag, tag_variable, variable, aggregate_variable, module_incidences_rule, \"user\" CASCADE;"
cat /home/etxebe/Desktop/renewables2023_clean.sql
echo "SET session_replication_role = 'origin';"
echo "UPDATE \"user\" SET password = '<HASH_GUARDADO>' WHERE username = 'admin';"
echo "SELECT setval('user_id_seq', (SELECT MAX(id) FROM \"user\"));"
echo "SELECT setval('aggregate_variable_id_seq', (SELECT MAX(id) FROM aggregate_variable));"
echo "SELECT setval('acl_entry_id_seq', (SELECT MAX(id) FROM acl_entry));"
echo "SELECT setval('acl_object_identity_id_seq', (SELECT MAX(id) FROM acl_object_identity));"
echo "SELECT setval('acl_sid_id_seq', (SELECT MAX(id) FROM acl_sid));"
echo "SELECT setval('acl_class_id_seq', (SELECT MAX(id) FROM acl_class));"
echo "SELECT setval('authority_id_seq', (SELECT MAX(id) FROM authority));"
echo "SELECT setval('tag_id_seq', (SELECT MAX(id) FROM tag));"
echo "SELECT setval('group_id_seq', (SELECT MAX(id) FROM \"group\"));"
echo "SELECT setval('variable_id_seq', (SELECT MAX(id) FROM variable));"
} | DOCKER_HOST=unix:///var/run/docker.sock docker exec -i postgres_ psql -U dwall -d dwallSTEP 3 — Hacer logout y login en la aplicación
El JWT de xabet embebe el user_id en el momento del login. Si el admin tenía id=1 antes del import y ahora tiene id=4, el JWT antiguo seguirá buscando user_id=1 en la tabla authority → resultado: 0 variables y 0 reglas visibles.
Cierra sesión en el navegador y vuelve a hacer login.
Por qué funciona
| Técnica | Motivo |
|---|---|
session_replication_role = 'replica' | Deshabilita los triggers de FK durante el COPY. El orden del dump no respeta dependencias (authority antes que user, aggregate_variable antes que variable). |
TRUNCATE ... CASCADE | Limpia todas las tablas del dump evitando conflictos de PK y UNIQUE. CASCADE también limpia tablas dependientes como group_user, data_value, module_incidences_*. |
setval(seq, MAX(id)) | Los COPY con IDs explícitos no actualizan las secuencias de PostgreSQL. Sin este paso, el backend fallará al insertar nuevos registros (conflicto de PK). |
| Restaurar password admin | El dump tiene el hash del admin del entorno origen, diferente al del entorno local. |
Datos de conexión
| Parámetro | Valor |
|---|---|
| Container Docker | postgres_ (sin sufijo de marca si se lanzó sin brand=) |
| Host | localhost:5432 |
| DB | dwall |
| User | dwall |
| Password | dwall |
ACL de variables agregadas — comportamiento del admin
ROLE_DATAcubre 4196 variables raw pero 0 variables agregadas- Las variables agregadas solo están cubiertas por
ROLE_XABETyROLE_GROUP_1 - El dump importado da a admin (id=4) la authority
ROLE_XABET→ tras un login fresco, admin ve las 28 variables agregadas correctamente - Si admin no tiene
ROLE_XABETen la tablaauthority, la sub-tabla de operadas/métricas/graduales aparece vacía aunque el usuario pueda ver la "tabla general" (que usa/explorer/variables, endpoint sin filtro ACL)