Files
SIG-CM2.0/database
dmolinari d4a2b3bc3e feat(tests): añade TestConnectionStrings y script de creación de DBs de test
Introduce SIGCM2_Test_App y SIGCM2_Test_Api como bases aisladas para
Application.Tests y Api.Tests respectivamente. TestConnectionStrings.cs
centraliza las connection strings; create-test-api-db.sql documenta
el setup idempotente de ambas bases con COLLATE Modern_Spanish_CI_AS.
2026-04-18 21:44:12 -03:00
..

database/ — SIG-CM 2.0

Todo el DDL del sistema vive acá: migraciones versionadas, stored procedures, functions, seeds.

Estructura

database/
├── migrations/        # Migraciones versionadas V0XX__<descripcion>.sql (SQL puro, idempotentes)
├── procedures/        # Stored procedures — creados/alterados por UDTs específicas
├── functions/         # User-defined functions
├── seeds/             # Data de referencia no-versionada
└── schemas/           # Extracciones de schema (referencia)

Migraciones aplicadas (orden obligatorio)

Versión Archivo UDT Descripción
V001 V001__create_usuario.sql UDT-001 Tabla Usuario + IX_Usuario_Username_Activo
V002 V002__create_refresh_token.sql UDT-002 Tabla RefreshToken
V003 V003__create_rol.sql UDT-004 Tabla Rol + 8 roles canónicos
V004 V004__alter_usuario_rol_fk.sql UDT-004 FK Usuario.Rol → Rol.Codigo
V005 V005__create_permiso.sql UDT-005 Tabla Permiso + 18 permisos canónicos
V006 V006__create_rol_permiso.sql UDT-005 Tabla RolPermiso + seed 36 rows
V007 V007__add_admin_permissions_udt006.sql UDT-006 3 permisos administrativos RBAC
V008 V008__add_mustchangepassword_and_indexes.sql UDT-008 Usuario.MustChangePassword + IX_Usuario_Activo_Rol
V009 V009__activate_permisos_overrides.sql UDT-009 Migración shape PermisosJson {grant, deny}
V010 V010__audit_infrastructure.sql UDT-010 Infra de auditoría + Temporal Tables. Ver nota abajo.
V011 V011__create_medio_seccion.sql ADM-001 Medio + Seccion (temporal, retention 10y) + permiso administracion:secciones:gestionar
V012 V012__seed_medios.sql ADM-001 Seed idempotente de Medios ELDIA y ELPLATA

Convenciones

  • SQL puro ejecutado manualmente (no hay runner automático; decisión arquitectónica).
  • Idempotentes: cada migración usa IF NOT EXISTS / MERGE / IF NOT EXISTS (SELECT 1 FROM sys....). Re-ejecutarlas es seguro.
  • Boilerplate inicial: SET QUOTED_IDENTIFIER ON; SET ANSI_NULLS ON; SET NOCOUNT ON; GO.
  • Naming: PK_*, UQ_*, FK_*, DF_*, CK_*, IX_*.
  • Se aplican a AMBAS bases: SIGCM2 (dev) y SIGCM2_Test (integration tests). El orden debe ser idéntico.

Cómo aplicar migraciones

En dev (manual)

# Con sqlcmd:
sqlcmd -S TECNICA3 -d SIGCM2      -U desarrollo -P desarrollo2026 -i database/migrations/V010__audit_infrastructure.sql
sqlcmd -S TECNICA3 -d SIGCM2_Test -U desarrollo -P desarrollo2026 -i database/migrations/V010__audit_infrastructure.sql

O desde SSMS: abrir el archivo, conectar a cada base, F5.

En integration tests

tests/SIGCM2.TestSupport/SqlTestFixture.cs aplica automáticamente el schema necesario en SIGCM2_Test al inicializar el fixture (EnsureV008SchemaAsync, EnsureV009SchemaAsync, EnsureV010SchemaAsync…). NO hace falta correr el script manualmente.

En producción (roadmap futuro)

  1. Backup completo de la base.
  2. Revisar notas específicas de la migración (ver abajo).
  3. Ventana de mantenimiento si la migración lo requiere.
  4. sqlcmd + script + verify que los PRINT salieron esperados.
  5. Smoke test post-migración.

⚠️ Notas especiales por migración

V010 — Infraestructura de Auditoría

Riesgos específicos:

  • Activa SYSTEM_VERSIONING en Usuario, Rol, Permiso, RolPermiso. Tablas con datos. ALTER TABLE ADD PERIOD FOR SYSTEM_TIME toma Sch-M lock (schema modification). En dev con pocos usuarios el lock es milisegundos; en prod con conexiones activas puede generar espera.
  • Crea filegroups AUDIT_HOT y AUDIT_COLD con archivos físicos <DB>_AUDIT_HOT.ndf y <DB>_AUDIT_COLD.ndf en el default data path del server.
  • Crea 2 partition functions + schemes mensuales (boundaries 2026-01..2027-02). El job AuditPartitionManagerJob (B11) extiende la ventana mes a mes.

Para aplicar en prod:

  1. Backup completo previo (no negociable).
  2. Ventana de mantenimiento ≥ 10 min (los ALTER de SYSTEM_VERSIONING son rápidos pero pueden caer en timeouts si hay transacciones largas).
  3. Ejecutar el script + verificar todos los PRINT "created/applied".
  4. Smoke test post: SELECT TOP 1 * FROM dbo.AuditEvent (vacío OK); SELECT temporal_type FROM sys.tables WHERE name = 'Usuario' (debe devolver 2 = system-versioned).
  5. Si algo falla → V010_ROLLBACK.sql (pierde toda la historia) o restore de backup.

Catálogo de entidades auditables (source of truth): Obsidian/02-ARQUITECTURA-y-TECH-STACK/2.5 📋 Auditoría.md. Cada UDT nueva que introduzca entidades de negocio debe agregar esas tablas al catálogo y activar SYSTEM_VERSIONING en su migración.

V011/V012 — ADM-001 Medios y Secciones

Alcance: crea dbo.Medio y dbo.Seccion con Temporal Tables (retention 10 años), el permiso administracion:secciones:gestionar (y lo asigna a rol admin), y siembra los dos Medios fundacionales ELDIA y ELPLATA.

Notas:

  • administracion:medios:gestionar ya existía desde V005 — no se toca.
  • PlataformaEmpresaId es INT NULL sin FK; la FK se agrega en INT-003 cuando se cree la tabla PlataformaEmpresa.
  • Seccion.Tipo acepta 'clasificados' | 'notables' | 'suplementos' (CHECK constraint). Config avanzada (par/impar, suplementos, cupos) se introduce en ADM-003.
  • Rollback: V012_ROLLBACK.sql (falla si hay Secciones vivas) → V011_ROLLBACK.sql. Rollback en prod NO soportado si ADM-008/009 o PRC-* ya aplicados.

Recursos

  • Design autoritativo: Obsidian/02-ARQUITECTURA-y-TECH-STACK/2.5 📋 Auditoría.md
  • Decisión persistida (engram): sig-cm2/audit-architecture
  • SDD artifacts UDT-010 (engram): sdd/udt-010-auditoria-trazabilidad/{explore,proposal,spec,design,tasks,apply-progress}