RunBooks/importar-datos-sql-xabet.md

Importar datos SQL en DigitalWall (xabet)

Leer antes de ejecutar

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 que variable (su FK)
  • authority → se importa antes que user (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 dwall

STEP 3 — Hacer logout y login en la aplicación

Obligatorio tras el import

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écnicaMotivo
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 ... CASCADELimpia 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 adminEl dump tiene el hash del admin del entorno origen, diferente al del entorno local.

Datos de conexión

ParámetroValor
Container Dockerpostgres_ (sin sufijo de marca si se lanzó sin brand=)
Hostlocalhost:5432
DBdwall
Userdwall
Passworddwall

ACL de variables agregadas — comportamiento del admin

Por qué admin no veía variables agregadas (operated/metrical/gradual)
  • ROLE_DATA cubre 4196 variables raw pero 0 variables agregadas
  • Las variables agregadas solo están cubiertas por ROLE_XABET y ROLE_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_XABET en la tabla authority, 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)