drizzle/0079_workspace_ownership_manual.sql
Rama main · réplica de lectura del repositorio original.
ALTER TABLE public.audit_events ADD COLUMN IF NOT EXISTS workspace_id text;
ALTER TABLE public.automatic_backup_runs ADD COLUMN IF NOT EXISTS workspace_id text;
ALTER TABLE public.companies ADD COLUMN IF NOT EXISTS workspace_id text;
ALTER TABLE public.public_status_pages ADD COLUMN IF NOT EXISTS workspace_id text;
ALTER TABLE public.monitors ADD COLUMN IF NOT EXISTS workspace_id text;
ALTER TABLE public.monitor_events ADD COLUMN IF NOT EXISTS workspace_id text;
ALTER TABLE public.monitor_checks ADD COLUMN IF NOT EXISTS workspace_id text;
ALTER TABLE public.monitor_outages ADD COLUMN IF NOT EXISTS workspace_id text;
ALTER TABLE public.webhook_endpoints ADD COLUMN IF NOT EXISTS workspace_id text;
ALTER TABLE public.delivery_events ADD COLUMN IF NOT EXISTS workspace_id text;
ALTER TABLE public.report_schedules ADD COLUMN IF NOT EXISTS workspace_id text;
ALTER TABLE public.monitor_diagnostics ADD COLUMN IF NOT EXISTS workspace_id text;
ALTER TABLE public.outage_events ADD COLUMN IF NOT EXISTS workspace_id text;
UPDATE public.companies AS target
SET workspace_id = (
SELECT workspace_id
FROM public.workspace_members
WHERE user_id = target.user_id
ORDER BY created_at, workspace_id
LIMIT 1
)
WHERE target.workspace_id IS NULL;
UPDATE public.public_status_pages AS target
SET workspace_id = COALESCE(
(SELECT workspace_id FROM public.companies WHERE id = target.company_id),
(
SELECT workspace_id
FROM public.workspace_members
WHERE user_id = target.user_id
ORDER BY created_at, workspace_id
LIMIT 1
)
)
WHERE target.workspace_id IS NULL;
UPDATE public.monitors AS target
SET workspace_id = COALESCE(
(SELECT workspace_id FROM public.companies WHERE id = target.company_id),
(
SELECT workspace_id
FROM public.workspace_members
WHERE user_id = target.user_id
ORDER BY created_at, workspace_id
LIMIT 1
)
)
WHERE target.workspace_id IS NULL;
UPDATE public.monitor_events AS target
SET workspace_id = monitor.workspace_id
FROM public.monitors AS monitor
WHERE target.workspace_id IS NULL AND monitor.id = target.monitor_id;
UPDATE public.monitor_checks AS target
SET workspace_id = monitor.workspace_id
FROM public.monitors AS monitor
WHERE target.workspace_id IS NULL AND monitor.id = target.monitor_id;
UPDATE public.monitor_outages AS target
SET workspace_id = monitor.workspace_id
FROM public.monitors AS monitor
WHERE target.workspace_id IS NULL AND monitor.id = target.monitor_id;
UPDATE public.monitor_diagnostics AS target
SET workspace_id = monitor.workspace_id
FROM public.monitors AS monitor
WHERE target.workspace_id IS NULL AND monitor.id = target.monitor_id;
UPDATE public.outage_events AS target
SET workspace_id = monitor.workspace_id
FROM public.monitors AS monitor
WHERE target.workspace_id IS NULL AND monitor.id = target.monitor_id;
UPDATE public.webhook_endpoints AS target
SET workspace_id = (
SELECT workspace_id
FROM public.workspace_members
WHERE user_id = target.user_id
ORDER BY created_at, workspace_id
LIMIT 1
)
WHERE target.workspace_id IS NULL;
UPDATE public.delivery_events AS target
SET workspace_id = COALESCE(
(SELECT workspace_id FROM public.monitors WHERE id = target.monitor_id),
(
SELECT workspace_id
FROM public.workspace_members
WHERE user_id = target.user_id
ORDER BY created_at, workspace_id
LIMIT 1
)
)
WHERE target.workspace_id IS NULL;
UPDATE public.report_schedules AS target
SET workspace_id = COALESCE(
(SELECT workspace_id FROM public.companies WHERE id = target.company_id),
(
SELECT workspace_id
FROM public.workspace_members
WHERE user_id = target.user_id
ORDER BY created_at, workspace_id
LIMIT 1
)
)
WHERE target.workspace_id IS NULL;
UPDATE public.audit_events AS target
SET workspace_id = COALESCE(
(
SELECT workspace_id FROM public.workspace_members
WHERE user_id = target.actor_user_id ORDER BY created_at, workspace_id LIMIT 1
),
(
SELECT workspace_id FROM public.workspace_members
WHERE user_id = target.user_id ORDER BY created_at, workspace_id LIMIT 1
),
(SELECT id FROM public.workspaces ORDER BY created_at, id LIMIT 1)
)
WHERE target.workspace_id IS NULL;
UPDATE public.automatic_backup_runs AS target
SET workspace_id = COALESCE(
(
SELECT workspace_id FROM public.workspace_members
WHERE user_id = target.owner_user_id ORDER BY created_at, workspace_id LIMIT 1
),
(SELECT id FROM public.workspaces ORDER BY created_at, id LIMIT 1)
)
WHERE target.workspace_id IS NULL;
DO $$
DECLARE
table_name text;
unresolved_count bigint;
BEGIN
FOREACH table_name IN ARRAY ARRAY[
'audit_events', 'automatic_backup_runs', 'companies', 'public_status_pages',
'monitors', 'monitor_events', 'monitor_checks', 'monitor_outages',
'webhook_endpoints', 'delivery_events', 'report_schedules',
'monitor_diagnostics', 'outage_events'
]
LOOP
EXECUTE format('SELECT count(*) FROM public.%I WHERE workspace_id IS NULL', table_name)
INTO unresolved_count;
IF unresolved_count > 0 THEN
RAISE EXCEPTION 'Unable to resolve workspace ownership for % row(s) in %.', unresolved_count, table_name;
END IF;
EXECUTE format('ALTER TABLE public.%I ALTER COLUMN workspace_id SET NOT NULL', table_name);
IF NOT EXISTS (
SELECT 1
FROM pg_constraint
WHERE conname = table_name || '_workspace_id_fkey'
AND conrelid = format('public.%I', table_name)::regclass
) THEN
EXECUTE format(
'ALTER TABLE public.%I ADD CONSTRAINT %I FOREIGN KEY (workspace_id) REFERENCES public.workspaces(id) ON DELETE CASCADE',
table_name,
table_name || '_workspace_id_fkey'
);
END IF;
END LOOP;
END $$;
CREATE INDEX IF NOT EXISTS audit_events_workspace_created_idx
ON public.audit_events (workspace_id, created_at);
CREATE INDEX IF NOT EXISTS automatic_backup_runs_workspace_updated_idx
ON public.automatic_backup_runs (workspace_id, updated_at);
CREATE INDEX IF NOT EXISTS companies_workspace_deleted_at_idx
ON public.companies (workspace_id, deleted_at);
CREATE INDEX IF NOT EXISTS public_status_pages_workspace_created_idx
ON public.public_status_pages (workspace_id, created_at);
CREATE INDEX IF NOT EXISTS monitors_workspace_deleted_at_idx
ON public.monitors (workspace_id, deleted_at);
CREATE INDEX IF NOT EXISTS monitor_events_workspace_created_idx
ON public.monitor_events (workspace_id, created_at);
CREATE INDEX IF NOT EXISTS monitor_checks_workspace_created_idx
ON public.monitor_checks (workspace_id, created_at);
CREATE INDEX IF NOT EXISTS monitor_outages_workspace_created_idx
ON public.monitor_outages (workspace_id, created_at);
CREATE INDEX IF NOT EXISTS webhook_endpoints_workspace_created_idx
ON public.webhook_endpoints (workspace_id, created_at);
CREATE INDEX IF NOT EXISTS delivery_events_workspace_created_idx
ON public.delivery_events (workspace_id, created_at);
CREATE INDEX IF NOT EXISTS report_schedules_workspace_created_idx
ON public.report_schedules (workspace_id, created_at);
CREATE INDEX IF NOT EXISTS monitor_diagnostics_workspace_created_idx
ON public.monitor_diagnostics (workspace_id, created_at);
CREATE INDEX IF NOT EXISTS outage_events_workspace_created_idx
ON public.outage_events (workspace_id, created_at);