iloom-flatten/migrations/20260523_170000_create_audit_logs_table.sql

47 lines
2.0 KiB
MySQL
Raw Normal View History

-- ============================================
-- 创建审计日志表
-- 用于记录敏感操作,便于安全审计
-- ============================================
-- 创建审计日志表
CREATE TABLE IF NOT EXISTS public.audit_logs (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID REFERENCES auth.users(id) ON DELETE SET NULL,
company_id UUID REFERENCES public.companies(id) ON DELETE SET NULL,
action TEXT NOT NULL, -- 操作类型login, logout, create, update, delete, export, etc.
resource_type TEXT NOT NULL, -- 资源类型plan, factory, warehouse, payment, profile, etc.
resource_id UUID, -- 被操作资源的ID
details JSONB, -- 操作详情JSON格式
ip_address TEXT, -- IP地址
user_agent TEXT, -- 用户代理
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
-- 创建索引
CREATE INDEX idx_audit_logs_user_id ON public.audit_logs(user_id);
CREATE INDEX idx_audit_logs_company_id ON public.audit_logs(company_id);
CREATE INDEX idx_audit_logs_action ON public.audit_logs(action);
CREATE INDEX idx_audit_logs_created_at ON public.audit_logs(created_at DESC);
-- 启用 RLS
ALTER TABLE public.audit_logs ENABLE ROW LEVEL SECURITY;
-- 审计日志策略:用户只能查看自己公司的日志
CREATE POLICY users_select_company_audit_logs ON public.audit_logs
FOR SELECT USING (
company_id = public.get_user_master_company_id()
);
-- 允许插入日志(应用层写入)
CREATE POLICY users_insert_audit_logs ON public.audit_logs
FOR INSERT WITH CHECK (true);
-- 禁止修改和删除审计日志(保证不可篡改)
-- 不提供 UPDATE 和 DELETE 策略
-- 注释
COMMENT ON TABLE public.audit_logs IS '审计日志表,记录所有敏感操作';
COMMENT ON COLUMN public.audit_logs.action IS '操作类型login, logout, create, update, delete, export';
COMMENT ON COLUMN public.audit_logs.resource_type IS '被操作的资源类型';
COMMENT ON COLUMN public.audit_logs.details IS '操作详情JSON格式存储变更前后数据';