Seguridad a nivel de columna

Un usuario Pregunto ✅

Greg_Deckler


Introducción

Recientemente, Chris Webb escribió un excelente blog titulado Pros y contras de las medidas de modelado como dimensión en Power BI. Es un gran artículo y vale la pena leerlo, lo recomiendo. En pocas palabras, opina que anular las columnas de valor es generalmente una mala idea. Entonces, en el ejemplo que usa Chris, hay columnas de Ventas, Impuestos y Volumen y esas columnas no están divididas de modo que terminas con 3 líneas, una para cada medida esencialmente. Chris explica además que la razón por la que es posible que desee hacer esto es:

  1. Ahora puede usar una segmentación en un informe para seleccionar las medidas que aparecen en un objeto visual.
  2. Ahora puede agregar fácilmente nuevas medidas sin tener que agregar nuevas columnas en su tabla de hechos
  3. Puede utilizar la seguridad a nivel de fila para controlar a qué medidas tiene acceso un usuario

Luego, Chris continúa explicando las desventajas de hacer esto y que uno debe ceñirse a tablas de hechos anchas y planas y esquemas en estrella. Nuevamente, es un gran artículo. Si hubiera una crítica, el artículo realmente no explica cómo aborda las ventajas de implementar una dimensión de medida dentro de una estructura de datos más tradicional. Entonces, pensé que lo probaría y demostraría cómo sortear la tercera ventaja dentro de una tabla de hechos más tradicional implementando seguridad a nivel de fila (RLS) para proporcionar seguridad a nivel de columna (CLS), esencialmente controlando qué columnas el usuario tiene acceso a. Aquí vamos.

Cómo cargar los datos

Primero, comencemos con algunos consejos sobre cómo cargar los datos. En nuestro ejemplo, tendremos algunos datos increíblemente simples que se pueden crear rápidamente usando un Introducir datos consulta. Esa información se ve así:

0.png

Entonces, piense en esto como transacciones de ventas con ingresos y costos. En nuestro escenario queremos tener un grupo de vendedores a los que se les permita ver Ingresos pero no se les permite ver Costo. Para lograr esto, vamos a dividir nuestros datos en dos tablas. Vamos a cargar las columnas que todos pueden ver en una tabla y cargar las columnas que solo ciertas personas deberían ver en otra.

Para dividir los datos en dos tablas, podríamos crear dos consultas a partir de la misma tabla de hechos base y simplemente eliminar las columnas no deseadas en cada una. Sin embargo, si se trata de una tabla de hechos muy grande, Power BI tendría que enumerar esa tabla de hechos base dos veces y no queremos procesar todos los datos dos veces, lo que podría duplicar nuestros tiempos de carga de datos. Para evitar eso, podemos usar Referencias siguiendo los pasos a continuación:

  • Empiece por crear los datos en un Introducir datos consulta
  • Haga clic derecho en la consulta Tabla y desmarcar Habilitar carga

1.png

  • Haga clic derecho en la consulta Tabla de nuevo y elige Referencia

2.png

  • Nombra esta consulta Ventas y quitar el Costo columna

3.png

  • Haga clic derecho en la consulta Tabla y de nuevo elige Referencia
  • Nombra esta tercera consulta Sales_Costs y quitar el Artículo y Monto columnas

4.png

  • Ahora podemos Cerrar y aplicar

Al usar una única consulta base que no se carga en el modelo de datos pero que se usa como referencia para nuestras otras dos consultas, logramos dos cosas importantes:

  1. Mantenemos el desorden innecesario fuera de nuestro modelo de datos
  2. Power BI solo procesa los datos provenientes del origen una sola vez y los almacena en caché localmente para usarlos en las consultas de referencia

Cómo fallar miserablemente

Ahora que tenemos nuestros datos cargados, debemos verificar si Power BI creó automáticamente una relación entre nuestras dos tablas. Si no es así, cree la relación en el Sales_Key columnas en ambas tablas. Power BI detectará correctamente que se trata de un Doce y cincuenta y nueve de la noche relación.

5.png

A continuación, cree una visualización de tabla simple que incluya Artículo, Monto y Costo con agregaciones predeterminadas (Suma).

6.png

Ahora, cree un rol llamado Persona de ventas con la siguiente regla yendo a Modelado en la cinta y luego Administrar roles:

7.png

Finalmente, use el Modelado pestaña en la cinta y elija Visto como y nuestro nuevo Persona de ventas papel y listo …

8.png

Falla.

Ciertamente impedimos que el personal de ventas viera el Costo columna, pero desafortunadamente esto también les impide ver cualquiera de las otras columnas que se supone que deben ver.

Cómo solucionar sus problemas mintiendo

¿Entonces qué está pasando? ¿Por qué el RLS dictaminó que implementamos para evitar que los vendedores vean el Costo La columna también afecta a todas las demás columnas del informe y, lo que es más importante, ¿cómo lo solucionamos? El problema radica en la relación entre Ventas y Sales_Costs.

5.png

Note que la relación es Doce y cincuenta y nueve de la noche y que la dirección del filtro transversal es Ambos. Debido a que la dirección del filtro cruzado es Ambos, las reglas de RLS que filtran las filas en el Sales_Costs tabla también fluye hacia atrás y filtra todas las filas en el Ventas tabla. Malo. Por lo tanto, es lógico que simplemente necesitemos establecer la dirección del filtro cruzado para que sea Soltero fluyendo de Ventas para Sales_Costs y no en la otra dirección y todo debería funcionar. Fácil. Oh, excepto que no puede establecer la dirección del filtro cruzado en Soltero en un Doce y cincuenta y nueve de la noche relación. Hmm, ¿qué hacer?

Bueno, siempre he descubierto que cuando uno está en una situación difícil, siempre es ventajoso, afirma la vida e incurre en cero mal karma, bueno, mentir. Eso es una broma. Pero, en este caso, mentir es exactamente lo que queremos hacer. Simplemente tenemos que decirle a nuestro modelo de Power BI una pequeña mentira piadosa y todo está bien en nuestro mundo. Esa mentira es decirle a Power BI que la relación entre nuestras dos tablas es realmente Muchos a uno.

9.png

Una vez que hagamos eso, podemos establecer la dirección del filtro cruzado en Soltero y estamos en casa libres. Seguro, es una mentira, pero en general puedo garantizar que no sufrirás efectos nocivos del karma. Principalmente.

En cualquier caso, ahora podemos ver nuestro informe como nuestro Persona de ventas papel y todo funciona, podemos ver lo que deberíamos ver y no podemos ver Costo.

10.png

Conclusión

Para solucionar problemas y salir adelante en la vida, miente. Mentir es ventajoso, afirma la vida y no incurre en ningún mal karma. Y mentir definitivamente no tiene un impacto en su resultado en la otra vida. Probablemente…

No sé por qué, pero siempre pienso que saco la lección equivocada de los artículos de mi blog … Oh, bueno.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *