Forum Discussion

Syndicate_Admin's avatar
Syndicate_Admin
Icon for Administrator rankAdministrator
5 years ago

Rendimiento en escenario complejo de RLS

Hola

Tengo un conjunto de datos que contiene información de factura para varios clientes. El objetivo final es un escenario incrustado, donde los usuarios que pertenecen a un cliente solo pueden ver sus datos. La tabla de hechos central representa los artículos de una factura (millones de registros). Cada uno de estos artículos está en una factura y cada factura pertenece a un cliente. Además, estos elementos tienen propiedades adicionales, modeladas a través de dimensiones. Por ejemplo, digamos una categoría y una ubicación donde se vendió el artículo (el modelo real contiene muchas propiedades, son confidenciales sin embargo, por lo que no puedo compartir el contenido exacto aquí). Estas propiedades también contienen información específica del cliente. Por lo tanto, quiero asegurarme a través del modelo de que solo los usuarios asociados con el cliente correcto pueden ver los datos en estas dimensiones.

A continuación, el modelo de ejemplo tiene este aspecto:

rspijker_0-1611221807329.png

En la base de datos de respaldo, estas relaciones existen y se garantiza que el modelo sea coherente. He introducido reglas RLS en las tablas "Clientes", "Ubicaciones" y "Categorías". Esto funciona según lo esperado, los datos se filtran correctamente y todo funciona.

Sin embargo, el problema es el rendimiento. Debido al número de dimensiones, vemos un gran número de combinaciones en cada consulta, que son innecesarias y ralentizan los informes a un rastreo. Idealmente, solo filtraríamos los elementos a través del RLS en la tabla "Clientes". Sin embargo, eso hace que si mostramos el contenido de, digamos, "Ubicaciones" en una segmentación de datos se muestren todos los artículos y no solo los específicos del cliente. Lo que realmente querría es que PowerBI no aplique las restricciones de RLS sobre algunas de las relaciones. Por ejemplo, quiero que RLS se aplique en la tabla "Ubicaciones" y quiero *selecciones* en esa tabla para filtrar la tabla "Elementos". No necesito las restricciones RLS para filtrar "Items" en cada consulta, ya que esto ya se logra mediante la restricción RLS en "Clientes".

¿Alguna idea sobre cómo manejar esto?

2 Replies


  • Por ejemplo, quiero que RLS se aplique en la tabla "Ubicaciones" y quiero *selecciones* en esa tabla para filtrar la tabla "Elementos".

    Sí, eso es lo que realmente está sucediendo en función de dónde se aplica RLS y cómo se mueven las flechas de filtro. RLS se aplica al borde exterior del modelo de datos y fluye hacia adentro hacia la tabla de hechos por sí mismo.

    ¿Ha considerado la creación de un Frankentable "CustomerLocationCategories" donde podría aplicar RLS sólo una vez?

    • Syndicate_Admin's avatar
      Syndicate_Admin
      Icon for Administrator rankAdministrator

      Entiendo el flujo predeterminado de RLS. Me gustaría poder anularlo porque no "añade ninguna seguridad" en mi caso. En cuanto a la tabla de combinación, el problema es que mi modelo real es mucho más complejo. Hay alrededor de 12 dimensiones diferentes similares a Ubicación y Categoría. Combinarlos en una sola tabla agregaría una cantidad significativa de duplicación de datos, esta tabla crecería muy grande debido al número de combinaciones. También se siente como si fuera en contra de las mejores prácticas en términos de tener un modelo de estrella y separar nuestras dimensiones. Pero lo pensaré un poco más, gracias por la sugerencia.