85 lines
3.1 KiB
SQL
85 lines
3.1 KiB
SQL
-- Initial schema creation
|
|
|
|
-- Documents table
|
|
CREATE TABLE IF NOT EXISTS documents (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
slug VARCHAR(255) UNIQUE NOT NULL,
|
|
title VARCHAR(500) NOT NULL,
|
|
content TEXT NOT NULL,
|
|
search_vector tsvector,
|
|
category VARCHAR(50) NOT NULL CHECK (category IN ('workflow', 'standard', 'guide', 'reference')),
|
|
path VARCHAR(500) NOT NULL,
|
|
version INTEGER DEFAULT 1,
|
|
metadata JSONB DEFAULT '{}',
|
|
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
|
|
updated_at TIMESTAMP NOT NULL DEFAULT NOW()
|
|
);
|
|
|
|
-- Prevention rules table
|
|
CREATE TABLE IF NOT EXISTS prevention_rules (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
rule_id VARCHAR(50) UNIQUE NOT NULL CHECK (LENGTH(TRIM(rule_id)) > 0),
|
|
name VARCHAR(255) NOT NULL,
|
|
pattern TEXT NOT NULL,
|
|
pattern_hash VARCHAR(64),
|
|
message TEXT NOT NULL,
|
|
severity VARCHAR(10) NOT NULL CHECK (severity IN ('error', 'warning', 'info')),
|
|
enabled BOOLEAN NOT NULL DEFAULT true,
|
|
document_id UUID REFERENCES documents(id) ON DELETE SET NULL,
|
|
category VARCHAR(50),
|
|
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
|
|
updated_at TIMESTAMP NOT NULL DEFAULT NOW()
|
|
);
|
|
|
|
-- Failure registry table (partitioned by time)
|
|
CREATE TABLE IF NOT EXISTS failure_registry (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
failure_id VARCHAR(50) UNIQUE NOT NULL,
|
|
category VARCHAR(50) NOT NULL,
|
|
severity VARCHAR(10) NOT NULL CHECK (severity IN ('critical', 'high', 'medium', 'low')),
|
|
error_message TEXT NOT NULL,
|
|
root_cause TEXT,
|
|
affected_files TEXT[],
|
|
regression_pattern VARCHAR(255),
|
|
status VARCHAR(20) NOT NULL DEFAULT 'active' CHECK (status IN ('active', 'resolved', 'deprecated')),
|
|
project_slug VARCHAR(100),
|
|
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
|
|
updated_at TIMESTAMP NOT NULL DEFAULT NOW()
|
|
) PARTITION BY RANGE (created_at);
|
|
|
|
-- Projects table
|
|
CREATE TABLE IF NOT EXISTS projects (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
name VARCHAR(255) UNIQUE NOT NULL,
|
|
slug VARCHAR(100) UNIQUE NOT NULL CHECK (LENGTH(TRIM(slug)) > 0),
|
|
guardrail_context TEXT,
|
|
active_rules VARCHAR(50)[],
|
|
metadata JSONB DEFAULT '{}',
|
|
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
|
|
updated_at TIMESTAMP NOT NULL DEFAULT NOW()
|
|
);
|
|
|
|
-- Audit log table (partitioned by time)
|
|
CREATE TABLE IF NOT EXISTS audit_log (
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
event_id VARCHAR(50) NOT NULL,
|
|
timestamp TIMESTAMP NOT NULL DEFAULT NOW(),
|
|
event_type VARCHAR(50) NOT NULL,
|
|
severity VARCHAR(20) NOT NULL,
|
|
actor VARCHAR(64) NOT NULL,
|
|
action VARCHAR(50) NOT NULL,
|
|
resource VARCHAR(255),
|
|
status VARCHAR(20) NOT NULL,
|
|
details JSONB DEFAULT '{}',
|
|
client_ip INET,
|
|
request_id VARCHAR(50),
|
|
created_at TIMESTAMP NOT NULL DEFAULT NOW()
|
|
) PARTITION BY RANGE (timestamp);
|
|
|
|
-- Create initial partition for current month
|
|
CREATE TABLE IF NOT EXISTS failure_registry_y2026m02 PARTITION OF failure_registry
|
|
FOR VALUES FROM ('2026-02-01') TO ('2026-03-01');
|
|
|
|
CREATE TABLE IF NOT EXISTS audit_log_y2026m02 PARTITION OF audit_log
|
|
FOR VALUES FROM ('2026-02-01') TO ('2026-03-01');
|