mmap/migrations/006_create_settings.sql
Tsuki d4448c6129
Some checks are pending
Docker Build and Push / build (push) Waiting to run
sync: add settings
2025-08-11 00:05:52 +08:00

95 lines
4.2 KiB
PL/PgSQL
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- 创建settings配置表
CREATE TABLE IF NOT EXISTS settings (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
key VARCHAR(255) NOT NULL UNIQUE,
value TEXT,
value_type VARCHAR(50) NOT NULL DEFAULT 'string', -- string, number, boolean, json
description TEXT,
category VARCHAR(100) DEFAULT 'general',
is_encrypted BOOLEAN DEFAULT FALSE,
is_system BOOLEAN DEFAULT FALSE, -- 系统配置,不允许删除
is_editable BOOLEAN DEFAULT TRUE, -- 是否允许编辑
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
created_by UUID,
updated_by UUID
);
-- 添加字段注释
COMMENT ON COLUMN settings.id IS '配置项唯一标识符';
COMMENT ON COLUMN settings.key IS '配置键名,全局唯一';
COMMENT ON COLUMN settings.value IS '配置值';
COMMENT ON COLUMN settings.value_type IS '值类型string, number, boolean, json';
COMMENT ON COLUMN settings.description IS '配置项描述';
COMMENT ON COLUMN settings.category IS '配置分类,便于分组管理';
COMMENT ON COLUMN settings.is_encrypted IS '是否为加密值';
COMMENT ON COLUMN settings.is_system IS '是否为系统配置';
COMMENT ON COLUMN settings.is_editable IS '是否允许编辑';
COMMENT ON COLUMN settings.created_by IS '创建者ID';
COMMENT ON COLUMN settings.updated_by IS '更新者ID';
-- 创建索引
CREATE INDEX IF NOT EXISTS idx_settings_key ON settings(key);
CREATE INDEX IF NOT EXISTS idx_settings_category ON settings(category);
CREATE INDEX IF NOT EXISTS idx_settings_is_system ON settings(is_system);
CREATE INDEX IF NOT EXISTS idx_settings_created_at ON settings(created_at);
-- 创建复合索引
CREATE INDEX IF NOT EXISTS idx_settings_category_key ON settings(category, key);
-- 为表创建更新时间触发器
CREATE TRIGGER update_settings_updated_at
BEFORE UPDATE ON settings
FOR EACH ROW
EXECUTE FUNCTION update_updated_at_column();
-- 插入一些默认配置
INSERT INTO settings (key, value, value_type, description, category, is_system) VALUES
('app.name', 'MMAP System', 'string', '应用名称', 'app', true),
('app.version', '1.0.0', 'string', '应用版本', 'app', true),
('app.debug', 'false', 'boolean', '调试模式', 'app', true),
('app.timezone', 'UTC', 'string', '系统时区', 'app', true),
('database.max_connections', '10', 'number', '数据库最大连接数', 'database', true),
('database.connection_timeout', '30', 'number', '数据库连接超时时间(秒)', 'database', true),
('kafka.max_retries', '3', 'number', 'Kafka最大重试次数', 'kafka', true),
('kafka.retry_delay', '1000', 'number', 'Kafka重试延迟(毫秒)', 'kafka', true),
('security.session_timeout', '3600', 'number', '会话超时时间(秒)', 'security', true),
('security.max_login_attempts', '5', 'number', '最大登录尝试次数', 'security', true),
('logging.level', 'info', 'string', '日志级别', 'logging', true),
('logging.max_files', '10', 'number', '最大日志文件数', 'logging', true),
('cache.ttl', '300', 'number', '缓存生存时间(秒)', 'cache', true),
('cache.max_size', '1000', 'number', '缓存最大条目数', 'cache', true)
ON CONFLICT (key) DO NOTHING;
-- 创建配置历史表(可选,用于审计)
CREATE TABLE IF NOT EXISTS settings_history (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
setting_id UUID NOT NULL REFERENCES settings(id) ON DELETE CASCADE,
old_value TEXT,
new_value TEXT,
changed_by UUID,
change_reason TEXT,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);
-- 为历史表创建索引
CREATE INDEX IF NOT EXISTS idx_settings_history_setting_id ON settings_history(setting_id);
CREATE INDEX IF NOT EXISTS idx_settings_history_created_at ON settings_history(created_at);
-- 创建配置变更触发器
CREATE OR REPLACE FUNCTION log_setting_change()
RETURNS TRIGGER AS $$
BEGIN
IF OLD.value IS DISTINCT FROM NEW.value THEN
INSERT INTO settings_history (setting_id, old_value, new_value, changed_by)
VALUES (NEW.id, OLD.value, NEW.value, NEW.updated_by);
END IF;
RETURN NEW;
END;
$$ language 'plpgsql';
-- 为settings表创建变更日志触发器
CREATE TRIGGER log_settings_changes
AFTER UPDATE ON settings
FOR EACH ROW
EXECUTE FUNCTION log_setting_change();