SET search_path TO atlas, public; -- 单张 AI 编辑保存素材 ID 和编辑参数;供应商任务 ID 只在工作空间内可见。 CREATE TABLE media_ai_edits ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), workspace_id UUID NOT NULL REFERENCES workspaces(id) ON DELETE RESTRICT, source_asset_id UUID NOT NULL, reference_asset_ids UUID[] NOT NULL DEFAULT '{}', settings JSONB NOT NULL, provider_task_id TEXT, output_asset_id UUID, status TEXT NOT NULL DEFAULT 'queued' CHECK (status IN ('queued', 'running', 'succeeded', 'failed', 'cancelled')), error_code TEXT, created_by_user_id UUID REFERENCES users(id) ON DELETE SET NULL, created_at TIMESTAMPTZ NOT NULL DEFAULT now(), started_at TIMESTAMPTZ, completed_at TIMESTAMPTZ, FOREIGN KEY (workspace_id, source_asset_id) REFERENCES media_assets(workspace_id, id) ON DELETE RESTRICT, FOREIGN KEY (workspace_id, output_asset_id) REFERENCES media_assets(workspace_id, id) ON DELETE RESTRICT, UNIQUE (workspace_id, id), CHECK (cardinality(reference_asset_ids) <= 2), CHECK ((status = 'succeeded') = (output_asset_id IS NOT NULL)), CHECK (status <> 'failed' OR error_code IS NOT NULL) ); CREATE INDEX ix_media_ai_edits_source ON media_ai_edits (workspace_id, source_asset_id, created_at DESC); ALTER TABLE media_ai_edits ENABLE ROW LEVEL SECURITY; ALTER TABLE media_ai_edits FORCE ROW LEVEL SECURITY; CREATE POLICY workspace_isolation ON media_ai_edits USING (workspace_id = app_current_workspace_id()) WITH CHECK (workspace_id = app_current_workspace_id());