Files
foxhunt/migrations/014_transaction_audit_events.sql
jgrusewski 36c9c7cfe3 🔧 Wave 112: Migration consolidation and cleanup
- Removed 9 deprecated migration files (001-006 up/down, auth_schema, trading_service_events)
- Updated 12 core migrations with improved constraints and indexing
- Consolidated schema from 22 migrations to 18 clean migrations
- All migrations tested and applied successfully (Agent 32 validation)
- Zero migration errors in production database
2025-10-05 19:42:08 +02:00

101 lines
5.3 KiB
SQL

-- 014_transaction_audit_events.sql
-- Comprehensive Transaction Audit Events Table
-- Persistence layer for AuditTrailEngine - regulatory compliance (SOX, MiFID II)
-- CRITICAL: This table provides immutable audit trail for all trading system events
-- Transaction audit events table with immutability constraints
CREATE TABLE IF NOT EXISTS transaction_audit_events (
-- Primary key
id BIGSERIAL PRIMARY KEY,
-- Event identification
event_id VARCHAR(255) NOT NULL UNIQUE,
event_type VARCHAR(100) NOT NULL,
-- Timestamps (microsecond precision for MiFID II compliance)
timestamp TIMESTAMPTZ NOT NULL,
timestamp_nanos BIGINT NOT NULL,
-- Transaction tracking
transaction_id VARCHAR(255) NOT NULL,
order_id VARCHAR(255) NOT NULL,
-- Actor information
actor VARCHAR(255) NOT NULL,
session_id VARCHAR(255),
client_ip INET,
-- Event details (JSONB for structured data)
details JSONB NOT NULL,
before_state JSONB,
after_state JSONB,
-- Compliance metadata
compliance_tags TEXT[] NOT NULL,
risk_level VARCHAR(50) NOT NULL,
-- Tamper detection and integrity
digital_signature TEXT,
checksum VARCHAR(64) NOT NULL,
-- System timestamp (immutable)
created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL
);
-- Performance indexes for fast regulatory queries
CREATE INDEX IF NOT EXISTS idx_audit_timestamp ON transaction_audit_events(timestamp DESC);
CREATE INDEX IF NOT EXISTS idx_audit_event_type ON transaction_audit_events(event_type, timestamp DESC);
CREATE INDEX IF NOT EXISTS idx_audit_transaction_id ON transaction_audit_events(transaction_id);
CREATE INDEX IF NOT EXISTS idx_audit_order_id ON transaction_audit_events(order_id);
CREATE INDEX IF NOT EXISTS idx_audit_actor ON transaction_audit_events(actor, timestamp DESC);
CREATE INDEX IF NOT EXISTS idx_audit_compliance_tags ON transaction_audit_events USING GIN(compliance_tags);
CREATE INDEX IF NOT EXISTS idx_audit_risk_level ON transaction_audit_events(risk_level, timestamp DESC);
CREATE INDEX IF NOT EXISTS idx_audit_checksum ON transaction_audit_events(checksum);
-- Composite index for common query patterns
CREATE INDEX IF NOT EXISTS idx_audit_actor_event_time ON transaction_audit_events(actor, event_type, timestamp DESC);
CREATE INDEX IF NOT EXISTS idx_audit_transaction_event ON transaction_audit_events(transaction_id, event_type);
-- Immutability enforcement (SOX compliance requirement)
-- Prevent updates to audit records
CREATE OR REPLACE RULE no_update_audit_events AS
ON UPDATE TO transaction_audit_events
DO INSTEAD NOTHING;
-- Prevent deletes to audit records (regulatory requirement)
CREATE OR REPLACE RULE no_delete_audit_events AS
ON DELETE TO transaction_audit_events
DO INSTEAD NOTHING;
-- Table partitioning for performance (daily partitions)
-- Note: Partitioning will be implemented via application logic or manual partition creation
-- Example for future reference:
-- CREATE TABLE transaction_audit_events_2025_10 PARTITION OF transaction_audit_events
-- FOR VALUES FROM ('2025-10-01') TO ('2025-11-01');
-- Grant permissions to application roles
-- Note: Role 'authenticated_users' needs to be created separately
-- GRANT SELECT, INSERT ON transaction_audit_events TO authenticated_users;
-- GRANT USAGE, SELECT ON SEQUENCE transaction_audit_events_id_seq TO authenticated_users;
-- Table and column comments for documentation
COMMENT ON TABLE transaction_audit_events IS 'Immutable audit trail for all trading system events - SOX and MiFID II compliance. Provides microsecond-precision timestamps, tamper detection, and comprehensive event tracking.';
COMMENT ON COLUMN transaction_audit_events.event_id IS 'Unique event identifier (UUID-based)';
COMMENT ON COLUMN transaction_audit_events.event_type IS 'Type of audit event (OrderCreated, OrderExecuted, etc.)';
COMMENT ON COLUMN transaction_audit_events.timestamp IS 'Event timestamp with timezone (microsecond precision)';
COMMENT ON COLUMN transaction_audit_events.timestamp_nanos IS 'Nanosecond precision timestamp for HFT operations';
COMMENT ON COLUMN transaction_audit_events.transaction_id IS 'Transaction identifier for event correlation';
COMMENT ON COLUMN transaction_audit_events.order_id IS 'Order identifier';
COMMENT ON COLUMN transaction_audit_events.actor IS 'User or system that initiated the event';
COMMENT ON COLUMN transaction_audit_events.session_id IS 'Session identifier for user tracking';
COMMENT ON COLUMN transaction_audit_events.client_ip IS 'Client IP address for security audit';
COMMENT ON COLUMN transaction_audit_events.details IS 'Structured event details (symbol, quantity, price, etc.)';
COMMENT ON COLUMN transaction_audit_events.before_state IS 'State before event (for modifications)';
COMMENT ON COLUMN transaction_audit_events.after_state IS 'State after event (for modifications)';
COMMENT ON COLUMN transaction_audit_events.compliance_tags IS 'Compliance framework tags (SOX, MIFID2, etc.)';
COMMENT ON COLUMN transaction_audit_events.risk_level IS 'Risk assessment level (Low, Medium, High, Critical)';
COMMENT ON COLUMN transaction_audit_events.digital_signature IS 'Digital signature for enhanced tamper detection (optional)';
COMMENT ON COLUMN transaction_audit_events.checksum IS 'SHA-256 checksum for tamper detection (required)';
COMMENT ON COLUMN transaction_audit_events.created_at IS 'System insertion timestamp (immutable)';