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) ySIGCM2_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)
- Backup completo de la base.
- Revisar notas específicas de la migración (ver abajo).
- Ventana de mantenimiento si la migración lo requiere.
sqlcmd+ script + verify que losPRINTsalieron esperados.- Smoke test post-migración.
⚠️ Notas especiales por migración
V010 — Infraestructura de Auditoría
Riesgos específicos:
- Activa
SYSTEM_VERSIONINGenUsuario,Rol,Permiso,RolPermiso. Tablas con datos.ALTER TABLE ADD PERIOD FOR SYSTEM_TIMEtoma 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_HOTyAUDIT_COLDcon archivos físicos<DB>_AUDIT_HOT.ndfy<DB>_AUDIT_COLD.ndfen 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:
- Backup completo previo (no negociable).
- Ventana de mantenimiento ≥ 10 min (los ALTER de SYSTEM_VERSIONING son rápidos pero pueden caer en timeouts si hay transacciones largas).
- Ejecutar el script + verificar todos los
PRINT"created/applied". - Smoke test post:
SELECT TOP 1 * FROM dbo.AuditEvent(vacío OK);SELECT temporal_type FROM sys.tables WHERE name = 'Usuario'(debe devolver2= system-versioned). - 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:gestionarya existía desde V005 — no se toca.PlataformaEmpresaIdesINT NULLsin FK; la FK se agrega en INT-003 cuando se cree la tablaPlataformaEmpresa.Seccion.Tipoacepta'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}