Estado: preparado, no ejecutado
Prerequisito: 012 REALTIME TENANT ISOLATION = PASS en staging local
Producción: sin cambios en la preparación de este documento
013: no ejecutar como parte de este plan
Aplicar únicamente el cambio de publicación Realtime para las tablas que ya tienen listeners tenant-scoped en el frontend:
public.sesionespublic.salaspublic.ventaspublic.gastosEl filtro de cada suscripción debe continuar siendo:
tenant_id=eq.<active_tenant_id>
Realtime no reemplaza RLS. Las policies tenant-scoped deben permanecer activas y ser la autoridad de aislamiento.
No iniciar el rollout sin aprobación explícita para producción.
pg_publication;pg_publication_tables;pg_policies;pg_trigger;pg_constraint;001–011 están aplicadas y verificadas en producción. No reaplicar migraciones ya instaladas.tenant_id es NOT NULL en las tablas objetivo.current_tenant_id() exige claim JWT válido y membership activa.realtimeService.js y filtros tenant.productos ni alertas_arqueo a la publicación.SONIXTECPROV3 no forma parte del destino.Publicar primero el frontend que ya contiene:
realtimeService.js singleton;rt-svc-tenant-<tenantId>;tenant_id=eq.<tenantId>;Validar que el bundle no contiene service keys ni URLs de otro proyecto.
Ejecutar en producción, en modo de verificación read-only:
SELECT pubname, puballtables
FROM pg_publication
WHERE pubname = 'supabase_realtime';
SELECT pubname, schemaname, tablename
FROM pg_publication_tables
WHERE pubname = 'supabase_realtime'
ORDER BY schemaname, tablename;
Registrar las relaciones existentes. Si alguna tabla objetivo ya está publicada, no ejecutar una operación duplicada.
Ejecutar únicamente:
docs/multi-tenant/fase-2-rollout/012_realtime_tenant_isolation.sql
Usar ON_ERROR_STOP=1 y detener el cambio ante cualquier error. No ejecutar 013.
La migración debe terminar con cuatro relaciones nuevas/confirmadas: sesiones, salas, ventas y gastos.
SELECT pubname, schemaname, tablename
FROM pg_publication_tables
WHERE pubname = 'supabase_realtime'
ORDER BY schemaname, tablename;
Confirmar que las cuatro tablas están publicadas y que no se agregaron tablas fuera del alcance.
Verificar simultáneamente:
current_tenant_id() devuelve el contexto esperado para una sesión válida;Realizar con dos usuarios autorizados en tenants distintos:
removeChannel, callbacks cero y subscriptions cero.realtimeService.getDebugInfo() y guardar la evidencia del cambio.Si falla la publicación o cualquier smoke test, detener el rollout y ejecutar únicamente el rollback de 012:
docs/multi-tenant/fase-2-rollout/012_realtime_tenant_isolation.rollback.sql
El rollback elimina de supabase_realtime las tablas sesiones, salas, ventas y gastos si están presentes. No revierte:
001–011.Después del rollback:
pg_publication_tables.El rollout se considera exitoso únicamente si:
013.Este documento no autoriza la ejecución. No aplicar 012 en producción hasta recibir una aprobación explícita posterior con ventana de cambio y rollback confirmado.