4.2 · Seguridad a nivel de fila (RLS)

Nivel 4 · Diseño, seguridad y rendimiento

4.2Seguridad a nivel de fila (RLS)

Objetivo: Crear roles estáticos, probarlos y montar la RLS dinámica con su tabla de correspondencia usuario → ámbito.
Tiempo estimado: 20 min · lectura autónoma · Si solo tienes 5 min: lee «Lo esencial en 30s» + el esquema.

Lo esencial en 30 segundos

  • La RLS filtra las filas según el usuario: un rol en Desktop lleva un filtro DAX (p. ej. [Región] = "Argel"), probado con «Ver como» y luego asignado en el Servicio.
  • Se filtran las dimensiones (el filtro se propaga a los hechos por la relación) en lugar de los hechos directamente — y siempre se prueba antes de publicar.
  • La RLS dinámica: un único rol que filtra mediante USERPRINCIPALNAME() y una tabla de seguridad (correo → ámbito) — el estándar pro, en lugar de un rol por persona.

Mini-caso hilado — Zineb abre el informe a los directores regionales

Zineb, controladora de gestión en una pyme agroalimentaria de Argel, publica un único informe de ventas para tres directores regionales — pero cada uno solo debe ver su región, porque las cifras por sector son confidenciales. Aplica el método: en Modelado → Administrar roles, crea «Región Argel» con el filtro DAX [Región] = "Argel" aplicado sobre la dimensión Región. Lo prueba con «Ver como»: todo el informe se restringe a Argel. Luego prepara la industrialización: una tabla Seguridad (Email, Región) vinculada a la dimensión, y un rol «Dinámico» cuyo filtro es Seguridad[Email] = USERPRINCIPALNAME(). Anota el hito: la asignación real de los usuarios se hará en el Servicio (nivel 5).

Caso autónomo de esta sección: vuelve en el curso, el esquema, el guion y el reto 48 h de la sección 4.2.

1. Un informe, varias lecturas

Un mismo informe, lecturas distintas: el director de Argel solo ve Argel, la directora general lo ve todo. Es la seguridad a nivel de fila (RLS): roles definidos en Desktop (Modelado → Administrar roles) que llevan filtros DAX como [Región] = "Argel". La RLS filtra las filas visibles según el usuario conectado: un informe, ámbitos distintos. Zineb define por tanto un rol por ámbito.

2. Filtrar las dimensiones, probar siempre

El filtro se coloca sobre las dimensiones (Región, Ciudad): por la relación, se propaga a las tablas de hechos — más fiable que filtrar los hechos directamente. Y siempre se prueba con «Ver como» (Modelado): se ve el informe con los ojos de un rol antes de publicar. Zineb simula «Región Argel» y comprueba que nada se desborda.

3. La RLS dinámica

Crear un rol por persona no escala. La versión dinámica industrializa: una tabla de seguridad (Email → Región) vinculada a la dimensión, y un único rol cuyo filtro es Seguridad[Email] = USERPRINCIPALNAME(). Cada usuario solo ve entonces su ámbito, sin rol dedicado. Zineb fija este estándar — es también el reflejo esperado en la PL-300.

Error frecuente de interpretación: «La RLS la pruebo con mi propia cuenta, pongo el filtro sobre los hechos al azar y creo un rol por persona». No, triple error. Se prueba con «Ver como»: un autor siempre lo ve todo, así que probar con su cuenta no demuestra nada. Se filtran las dimensiones (el filtro se propaga a los hechos), no los hechos directamente. Y se pasa a la RLS dinámica (USERPRINCIPALNAME + tabla de seguridad) en lugar de apilar un rol por persona, ingobernable.
De estática a dinámica El bloque de seguridad: un rol con filtro DAX, probado y luego industrializado en dinámica. Rol Filtro DAX[Región] = "Argel"Probar Ver comoTabla seguridad Email→ Región
El bloque de seguridad: un rol con filtro DAX, probado y luego industrializado en dinámica.
Versión en texto del esquema (SEO / lectores de pantalla / traducción): 1) Zineb, controladora de gestión en Argel, quiere un informe único leído de forma distinta por los directores regionales: crea roles (Modelado → Administrar roles) con un filtro DAX como [Región] = "Argel", aplicado sobre la dimensión Región. 2) Prueba cada rol con «Ver como» — nunca con su propia cuenta de autora, que siempre lo ve todo — y comprueba que el filtro de las dimensiones se propaga a los hechos. 3) Industrializa: una tabla de seguridad (Email → Región) vinculada a la dimensión, y un único rol dinámico filtrado por Seguridad[Email] = USERPRINCIPALNAME(). Lección: filtrar las dimensiones, probar siempre y preferir la RLS dinámica a un rol por persona.

🔎 Ejemplo concreto — 🔎 Ejemplo concreto — El rol dinámico

Zineb hace que todos los ámbitos quepan en un solo rol:

Tabla Seguridad (Email, Región) vinculada a la dimensión Región.
Rol «Dinámico», filtro en Seguridad:
  Seguridad[Email] = USERPRINCIPALNAME()
→ cada usuario solo ve su ámbito, sin rol dedicado.

Lectura: un solo rol basta para todos — la tabla de seguridad lleva la correspondencia correo → región.

Lección: probar con «Ver como» especificando un correo de la tabla: el ámbito sigue a la identidad.

Vocabulario de la sección

RLS (Row-Level Security)
Filtrar las FILAS visibles según el usuario conectado: un informe, ámbitos de datos distintos.

Ejemplo sencillo: Zineb restringe el informe a la región de cada director.

Lo que no es: compartir un informe donde todos ven todo.

Reflejo: datos confidenciales → RLS.

Rol
Un conjunto de filtros DAX con nombre (Modelado → Administrar roles): «Región Argel» = [Región]="Argel".

Ejemplo sencillo: Zineb crea un rol por ámbito y luego un rol dinámico.

Lo que no es: un filtro puesto a mano en un solo visual.

Reflejo: rol = filtro DAX con nombre y reutilizable.

Ver como
La prueba en Desktop (Modelado → Ver como): ver el informe con los ojos de un rol antes de publicar.

Ejemplo sencillo: Zineb simula «Región Argel» y solo ve Argel.

Lo que no es: probar con su propia cuenta de autora.

Reflejo: la RLS se prueba, siempre, antes de publicar.

USERPRINCIPALNAME()
La función que devuelve el correo del usuario conectado: la clave de la RLS dinámica.

Ejemplo sencillo: Zineb la usa para filtrar las filas según la identidad.

Lo que no es: un filtro fijado a un solo valor.

Reflejo: RLS dinámica → USERPRINCIPALNAME().

Tabla de seguridad
La tabla de correspondencia correo → ámbito (región, ciudad…) que un único rol dinámico atraviesa para filtrar.

Ejemplo sencillo: Zineb lista en ella Email y Región para sus directores regionales.

Lo que no es: un rol dedicado por persona.

Reflejo: un rol dinámico + una tabla de seguridad.

En la práctica — En la práctica — Del rol estático a la RLS dinámica

  1. Modelado → Administrar roles → Nuevo: «Región Argel» con el filtro DAX [Región] = "Argel" (sobre la dimensión Región — la mejor opción).
  2. Pruebe: Modelado → Ver como → marque el rol: todo el informe se restringe a Argel. Salga del modo de prueba.
  3. Versión dinámica: cree una tabla Seguridad (Email, Región) con 2-3 filas, vincúlela a la dimensión Región y luego un rol «Dinámico» filtrado por Seguridad[Email] = USERPRINCIPALNAME().
  4. Pruebe de nuevo con «Ver como» especificando un correo de la tabla: el ámbito sigue a la identidad. (La asignación real de los usuarios se hace en el Servicio — nivel 5.)
La RLS dominada en sus dos formas — el bloque de seguridad exigido en toda implementación de empresa (y en la PL-300).

Guion paso a paso — asegurar el informe como Zineb (8 min)

1) Modelado → Administrar roles → Nuevo, nombre «Región Argel», seleccione la dimensión Región y escriba el filtro DAX [Región] = "Argel". 2) Modelado → Ver como → marque el rol: todo el informe se limita a Argel; desmarque para volver. 3) Cree una tabla Seguridad (Email, Región) de 2-3 filas y vincule Región a la dimensión Región. 4) Rol «Dinámico»: filtro Seguridad[Email] = USERPRINCIPALNAME(). 5) Pruebe con «Ver como» introduciendo un correo de la tabla: el ámbito sigue a la identidad. La asignación de los usuarios se hará en el Servicio.

Si la prueba no cambia nada, compruebe el sentido de la relación y que el filtro se aplica bien a la DIMENSIÓN (el filtro se propaga a los hechos).

Plantilla copiar y pegar — mi lista de verificación de RLS

Roles: Modelado → Administrar roles → Nuevo
Filtro estático: [Región] = "Argel" (sobre la DIMENSIÓN, no los hechos)
Probar: Modelado → Ver como (nunca con su propia cuenta)
Dinámica: tabla Seguridad (Email, Región) + rol filtrado por
  Seguridad[Email] = USERPRINCIPALNAME()
Asignación de los usuarios: en el Servicio (nivel 5).

Por región

Zineb crea un rol «Región Argel»: el director de Argel solo ve su región.

Prueba «Ver como»

Zineb simula cada rol antes de publicar: ningún ámbito se desborda.

Un rol para todos

Zineb sustituye los roles por persona por un rol dinámico USERPRINCIPALNAME().

Dimensiones primero

Zineb filtra la dimensión Región: el filtro se propaga a las ventas por la relación.

Prudencia: La RLS afecta a la confidencialidad de los datos: defina quién tiene derecho a ver qué, pruebe cada rol antes de publicar y documente los ámbitos. Estas reglas corresponden al gobierno de su organización — la RLS filtra las filas, pero no sustituye los permisos de acceso al informe. En caso de duda sobre un ámbito sensible, haga validar la regla internamente.

✓ Buenas prácticas

  • Filtrar las dimensiones (el filtro se propaga a los hechos por la relación).
  • Probar con «Ver como» antes de cualquier publicación.
  • Preferir la RLS dinámica (USERPRINCIPALNAME + tabla de seguridad).

✗ Errores frecuentes

  • Filtrar directamente los hechos en lugar de las dimensiones.
  • Publicar una RLS sin haberla probado.
  • Crear un rol por persona (ingobernable; preferir el dinámico).

Puntos clave

  • La RLS filtra los datos por usuario: un informe único, visiones múltiples.
  • Filtre las DIMENSIONES en lugar de los hechos directamente.
  • «Ver como» antes de cualquier publicación: la RLS se prueba, siempre.
  • La RLS dinámica (USERPRINCIPALNAME + tabla de seguridad) evita un rol por persona.

Reto 48 h — aplícalo mañana

Como Zineb, cree un rol RLS en un informe (p. ej. [Región] = "Argel"), pruébelo con «Ver como» y luego monte la tabla de seguridad + el rol dinámico (USERPRINCIPALNAME). Escriba en una frase quién debe ver qué en su organización.

Lista de salida de la sección
  • Puedo crear un rol RLS con un filtro DAX y probarlo («Ver como»).
  • Filtro las dimensiones y sé por qué.
  • Sé montar una RLS dinámica con USERPRINCIPALNAME y una tabla de seguridad.
Autoevaluación 1-5: ¿coloco siempre el filtro sobre la dimensión?Autoevaluación 1-5: ¿he probado cada rol antes de considerarlo listo?

Preguntas frecuentes

¿La RLS se me aplica también a mí, el autor?

En Desktop, no (salvo en modo de prueba): usted lo ve todo. En el Servicio, los administradores y miembros del espacio de trabajo no están sujetos a la RLS — juega para los lectores. No concluya por tanto que «no funciona» al probarla con su propia cuenta.

¿La RLS protege contra la exportación de datos?

Sí para el ámbito: un lector limitado a Argel solo exporta las filas de Argel. Pero no sustituye los permisos de acceso al informe (quién puede abrirlo): las dos capas se complementan.

Comprueba tu comprensión

¿Qué función es la clave de la RLS dinámica?

Recursos adicionales (opcional, para ir más allá)

Examen del nivel 4Preguntas inéditas y más difíciles para validar tus conocimientos