37 lines
1.3 KiB
SQL
37 lines
1.3 KiB
SQL
-- Migration 008: Saga State Store
|
|
-- Stores saga orchestration state for long-running business processes
|
|
|
|
CREATE TABLE IF NOT EXISTS saga_states (
|
|
saga_id TEXT NOT NULL,
|
|
correlation_id TEXT NOT NULL,
|
|
saga_name TEXT NOT NULL,
|
|
state INT NOT NULL, -- 0=NotStarted, 1=Running, 2=Completed, 3=Compensating, 4=Compensated, 5=Failed, 6=Paused
|
|
current_step INT NOT NULL DEFAULT 0,
|
|
total_steps INT NOT NULL DEFAULT 0,
|
|
completed_steps JSONB NOT NULL DEFAULT '[]'::jsonb,
|
|
started_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
last_updated TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
completed_at TIMESTAMPTZ NULL,
|
|
error_message TEXT NULL,
|
|
data JSONB NOT NULL DEFAULT '{}'::jsonb,
|
|
|
|
CONSTRAINT pk_saga_states PRIMARY KEY (saga_id)
|
|
);
|
|
|
|
-- Index for querying by correlation ID
|
|
CREATE INDEX IF NOT EXISTS idx_saga_states_correlation_id
|
|
ON saga_states (correlation_id);
|
|
|
|
-- Index for querying by saga name
|
|
CREATE INDEX IF NOT EXISTS idx_saga_states_saga_name
|
|
ON saga_states (saga_name);
|
|
|
|
-- Index for querying by state
|
|
CREATE INDEX IF NOT EXISTS idx_saga_states_state
|
|
ON saga_states (state);
|
|
|
|
-- Index for querying active sagas (Running, Paused, Compensating)
|
|
CREATE INDEX IF NOT EXISTS idx_saga_states_active
|
|
ON saga_states (state)
|
|
WHERE state IN (1, 3, 6);
|