From a51a7bc07e94fa10aae0a5b47cf58d937b4c7544 Mon Sep 17 00:00:00 2001 From: dmolinari Date: Sat, 18 Apr 2026 09:39:00 -0300 Subject: [PATCH] feat(udt-011): V015 create v_AuditEvent_Local + v_SecurityEvent_Local views --- .../V015__create_local_timezone_views.sql | 88 +++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 database/migrations/V015__create_local_timezone_views.sql diff --git a/database/migrations/V015__create_local_timezone_views.sql b/database/migrations/V015__create_local_timezone_views.sql new file mode 100644 index 0000000..fa483a2 --- /dev/null +++ b/database/migrations/V015__create_local_timezone_views.sql @@ -0,0 +1,88 @@ +-- V015__create_local_timezone_views.sql +-- UDT-011: Vistas admin con OccurredAt convertido a hora Argentina. +-- +-- Crea: +-- dbo.v_AuditEvent_Local — AuditEvent con OccurredAtLocal (offset -03:00) +-- dbo.v_SecurityEvent_Local — SecurityEvent con OccurredAtLocal (offset -03:00) +-- +-- Conversión: OccurredAt AT TIME ZONE 'UTC' AT TIME ZONE 'Argentina Standard Time' +-- → offset fijo -03:00, sin DST (Argentina dejó el horario de verano en 2009). +-- → Nombre 'Argentina Standard Time' es portable: Windows + SQL Server Linux 2022+ (via ICU). +-- +-- Idempotente: re-ejecutable. Guard IF OBJECT_ID IS NULL en cada vista. +-- No altera tablas base — rollback seguro sin pérdida de datos. +-- Reversa: V015_ROLLBACK.sql. +-- Run on: SIGCM2 (dev) y SIGCM2_Test (integration tests). +-- +-- Covers: REQ-DB-VIEWS-001, REQ-DB-VIEWS-002, REQ-DB-VIEWS-003, REQ-DB-VIEWS-004 + +SET QUOTED_IDENTIFIER ON; +SET ANSI_NULLS ON; +SET NOCOUNT ON; +GO + +-- ═══════════════════════════════════════════════════════════════════════ +-- 1. dbo.v_AuditEvent_Local +-- ═══════════════════════════════════════════════════════════════════════ +-- Nota: CREATE VIEW no permite IF...BEGIN...END directo — se usa EXEC('CREATE VIEW ...'). + +IF OBJECT_ID('dbo.v_AuditEvent_Local', 'V') IS NULL +BEGIN + EXEC(' + CREATE VIEW dbo.v_AuditEvent_Local AS + SELECT + Id, + OccurredAt, + OccurredAt AT TIME ZONE ''UTC'' AT TIME ZONE ''Argentina Standard Time'' AS OccurredAtLocal, + ActorUserId, + ActorRoleId, + Action, + TargetType, + TargetId, + CorrelationId, + IpAddress, + UserAgent, + Metadata + FROM dbo.AuditEvent; + '); + PRINT 'View dbo.v_AuditEvent_Local created.'; +END +ELSE + PRINT 'View dbo.v_AuditEvent_Local already exists — skip.'; +GO + +-- ═══════════════════════════════════════════════════════════════════════ +-- 2. dbo.v_SecurityEvent_Local +-- ═══════════════════════════════════════════════════════════════════════ + +IF OBJECT_ID('dbo.v_SecurityEvent_Local', 'V') IS NULL +BEGIN + EXEC(' + CREATE VIEW dbo.v_SecurityEvent_Local AS + SELECT + Id, + OccurredAt, + OccurredAt AT TIME ZONE ''UTC'' AT TIME ZONE ''Argentina Standard Time'' AS OccurredAtLocal, + ActorUserId, + AttemptedUsername, + SessionId, + Action, + Result, + FailureReason, + IpAddress, + UserAgent, + Metadata + FROM dbo.SecurityEvent; + '); + PRINT 'View dbo.v_SecurityEvent_Local created.'; +END +ELSE + PRINT 'View dbo.v_SecurityEvent_Local already exists — skip.'; +GO + +PRINT ''; +PRINT 'V015 applied successfully.'; +PRINT ' - dbo.v_AuditEvent_Local (AuditEvent + OccurredAtLocal offset -03:00)'; +PRINT ' - dbo.v_SecurityEvent_Local (SecurityEvent + OccurredAtLocal offset -03:00)'; +PRINT ' - Argentina Standard Time = UTC-3 (fixed offset, no DST since 2009)'; +GO