Las vistas en Supabase son consultas SQL predefinidas que actúan como tablas virtuales, permitiendo simplificar consultas complejas, combinar múltiples tablas y aplicar filtros sin alterar la estructura de datos subyacente. Se crean mediante el Editor SQL en el panel de control usando la sintaxis CREATE VIEW y pueden exponerse automáticamente a través de las APIs REST y GraphQL generadas por Supabase.
Las vistas no heredan las reglas de seguridad a nivel de fila (RLS) de las tablas originales.
Para garantizar que la seguridad RLS se aplique a la vista, debes especificar la opción security_invoker = true durante su creación o alteración, asegurando que los usuarios solo accedan a los datos autorizados según las políticas definidas.
Para crear vistas en Supabase, se utiliza la sentencia CREATE VIEW en el editor SQL del panel de control, definiendo la consulta que deseas guardar como una tabla virtual. La sentencia CREATE VIEW se escribe seguida del nombre deseado y la consulta SELECT. Ejemplo:
CREATE VIEW vista_ejemplo AS
SELECT nombre, edad
FROM usuarios;
Para aplicar la seguridad RLS a una vista, debes usar la opción security_invoker = true:
CREATE VIEW vista_ejemplo
WITH (security_invoker = true)
AS
SELECT nombre, edad
FROM usuarios;
Las vistas materializadas permiten mejorar el rendimiento en consultas complejas o con grandes volúmenes de datos, ya que almacenan físicamente los resultados.
Las vistas materializadas requieren actualización manual o programada para mantener los datos sincronizados con las tablas base:
CREATE MATERIALIZED
VIEW vista_ejemplo
AS
SELECT nombre, edad
FROM usuarios;
Para actualizar una vista materializada, se utiliza la sentencia REFRESH MATERIALIZED VIEW:
CREATE VIEW numempleados AS
SELECT COUNT(*) AS totalempleados
FROM empleado;
Utilizando las tablas empleado y la vista creada en el punto 1, realizar una consulta que muestre el porcentaje de empleados con y sin hijos. (Función CASE)
SELECT d.descendencia, count(d.*) AS numeroempleados, t.totalempleados, (count(d.*)::float/totalempleados::float*100) AS porcentaje_hijos
FROM descendientes AS d, numempleados AS t
GROUP BY d.descendencia, t.totalempleados;
En Postgres para dividir dos enteros y obtener un decimal tenemos que convertir los enteros a números decimales (float). Para ello se coloca a continuación del nombre del campo
::float