Files
GovAI/server/migrations/000005_models_quotas_audit.up.sql
2026-06-15 23:48:37 +08:00

109 lines
4.3 KiB
SQL

-- 000005: 模型配额、提供商、知识库、审计日志
-- 模型提供商表
CREATE TABLE model_providers (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
name VARCHAR(100) NOT NULL,
base_url TEXT NOT NULL,
api_key_encrypted TEXT NOT NULL,
models JSONB NOT NULL DEFAULT '[]',
is_active BOOLEAN NOT NULL DEFAULT true,
priority INTEGER NOT NULL DEFAULT 0,
config JSONB NOT NULL DEFAULT '{}',
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE TRIGGER update_model_providers_updated_at
BEFORE UPDATE ON model_providers
FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
-- 模型配额表
CREATE TABLE model_quotas (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
target_type VARCHAR(20) NOT NULL
CHECK (target_type IN ('global', 'department', 'user')),
target_id UUID,
model_name VARCHAR(100),
daily_token_limit BIGINT,
monthly_token_limit BIGINT,
daily_request_limit INTEGER,
is_active BOOLEAN NOT NULL DEFAULT true,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE INDEX idx_quotas_target ON model_quotas(target_type, target_id);
CREATE TRIGGER update_model_quotas_updated_at
BEFORE UPDATE ON model_quotas
FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
-- 知识库表
CREATE TABLE knowledge_bases (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
name VARCHAR(100) NOT NULL,
description TEXT,
owner_id UUID NOT NULL REFERENCES users(id),
dept_id UUID REFERENCES departments(id),
dify_dataset_id VARCHAR(255),
visibility VARCHAR(20) NOT NULL DEFAULT 'private'
CHECK (visibility IN ('private', 'department', 'public')),
doc_count INTEGER NOT NULL DEFAULT 0,
total_chars BIGINT NOT NULL DEFAULT 0,
status VARCHAR(20) NOT NULL DEFAULT 'active'
CHECK (status IN ('active', 'inactive')),
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE INDEX idx_kb_owner ON knowledge_bases(owner_id);
CREATE INDEX idx_kb_dept ON knowledge_bases(dept_id);
CREATE TRIGGER update_knowledge_bases_updated_at
BEFORE UPDATE ON knowledge_bases
FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
-- 知识库文档表
CREATE TABLE knowledge_documents (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
kb_id UUID NOT NULL REFERENCES knowledge_bases(id) ON DELETE CASCADE,
name VARCHAR(255) NOT NULL,
file_url TEXT,
file_type VARCHAR(20)
CHECK (file_type IN ('pdf', 'docx', 'txt', 'md', 'csv', 'xlsx')),
file_size BIGINT NOT NULL DEFAULT 0,
char_count BIGINT NOT NULL DEFAULT 0,
dify_doc_id VARCHAR(255),
indexing_status VARCHAR(20) NOT NULL DEFAULT 'pending'
CHECK (indexing_status IN ('pending', 'indexing', 'completed', 'failed')),
uploader_id UUID NOT NULL REFERENCES users(id),
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE INDEX idx_docs_kb ON knowledge_documents(kb_id);
CREATE INDEX idx_docs_status ON knowledge_documents(indexing_status);
CREATE TRIGGER update_knowledge_documents_updated_at
BEFORE UPDATE ON knowledge_documents
FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
-- 审计日志表
CREATE TABLE audit_logs (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID REFERENCES users(id),
action VARCHAR(50) NOT NULL,
resource_type VARCHAR(50) NOT NULL,
resource_id UUID,
details JSONB NOT NULL DEFAULT '{}',
ip_address INET,
user_agent TEXT,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE INDEX idx_audit_user ON audit_logs(user_id);
CREATE INDEX idx_audit_action ON audit_logs(action);
CREATE INDEX idx_audit_resource ON audit_logs(resource_type, resource_id);
CREATE INDEX idx_audit_created ON audit_logs(created_at);