Ctrl K
ComunidadGuías…

drizzle/0079_workspace_ownership_manual.sql

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
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);