PostgreSQL doesn't support inline CONSTRAINT with WHERE clause. Changed to separate CREATE UNIQUE INDEX statement for the partial unique constraint on (tech_id, agent_id, status) WHERE status = 'active'. This ensures only one active tunnel session per (tech, agent) pair while allowing multiple closed sessions in history. Migration tested and verified on PostgreSQL 14.
46 lines
1.7 KiB
SQL
46 lines
1.7 KiB
SQL
-- GuruRMM Tunnel Sessions Schema
|
|
-- Creates tables for technician SSH tunnel sessions and audit logging
|
|
|
|
-- Tech Sessions table
|
|
-- Stores active and historical SSH tunnel sessions between technicians and agents
|
|
CREATE TABLE tech_sessions (
|
|
id SERIAL PRIMARY KEY,
|
|
session_id VARCHAR(36) UNIQUE NOT NULL,
|
|
tech_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
agent_id UUID NOT NULL REFERENCES agents(id) ON DELETE CASCADE,
|
|
opened_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
last_activity TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
closed_at TIMESTAMPTZ,
|
|
status VARCHAR(20) NOT NULL DEFAULT 'active'
|
|
);
|
|
|
|
-- Partial unique index to ensure only one active session per tech-agent pair
|
|
CREATE UNIQUE INDEX unique_active_session ON tech_sessions(tech_id, agent_id, status)
|
|
WHERE status = 'active';
|
|
|
|
-- Index for finding sessions by technician
|
|
CREATE INDEX idx_tech_sessions_tech ON tech_sessions(tech_id);
|
|
|
|
-- Index for finding sessions by agent
|
|
CREATE INDEX idx_tech_sessions_agent ON tech_sessions(agent_id);
|
|
|
|
-- Index for filtering by session status
|
|
CREATE INDEX idx_tech_sessions_status ON tech_sessions(status);
|
|
|
|
-- Tunnel Audit table
|
|
-- Detailed audit log for all tunnel operations and channel activity
|
|
CREATE TABLE tunnel_audit (
|
|
id BIGSERIAL PRIMARY KEY,
|
|
session_id VARCHAR(36) NOT NULL REFERENCES tech_sessions(session_id) ON DELETE CASCADE,
|
|
channel_id VARCHAR(36) NOT NULL,
|
|
operation VARCHAR(50) NOT NULL,
|
|
details JSONB,
|
|
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
);
|
|
|
|
-- Index for querying audit logs by session
|
|
CREATE INDEX idx_tunnel_audit_session ON tunnel_audit(session_id);
|
|
|
|
-- Index for time-based audit queries
|
|
CREATE INDEX idx_tunnel_audit_created ON tunnel_audit(created_at);
|