Forum Discussion
Problema con las medidas RLS y DAX
Hola a todos,
Me enfrento a un problema con una medida de DAX en Power BI que usa las funciones ISFILTERED e ISINSCOPE. He implementado la seguridad de nivel de fila (RLS) basada en la dirección de correo electrónico del usuario que ha iniciado sesión, pero cuando incorporo estas funciones a mi medida, el RLS no parece aplicarse correctamente.
He aquí un extracto de mi medida:
Po TCV RLS =SWITCH(TRUE(),
ISINSCOPE('Dim Actor'[CdSeller]) || ISINSCOPE('Dim Actor'[LbSeller]) || ISFILTERED('Dim Actor'[CdSeller]),
CALCULATE( SUM('Fact Sale'[MeasureWeightedTCV]),
'Fait vente'[TypeActeur] IN {"VRC", "VP"},
NOT(LEFT('Fait Vente' [código de función], 3) EN {"RDV", "RAV"})
),
1000001
)
Aquí hay un extracto de mi RLS DAX :
[Vendedor de CD] EN SELECTCOLUMNS(
FILTER('Dim Actor', 'Dim Actor'[email] = USERPRINCIPALNAME()),
"cdseller", 'Dim Actor' [CdSeller])
Observaciones:
- Cuando uso solo CALCULATE sin ISFILTERED o ISINSCOPE, el RLS funciona como se espera.
- Al agregar estas condiciones, la medida devuelve de forma coherente el valor predeterminado (1000001), lo que indica que el RLS ya no se aplica.
- He comprobado las relaciones entre mis tablas y estoy seguro de que están configuradas correctamente.
Preguntas:
¿Alguien se ha encontrado con un problema similar? ¿Existen soluciones o prácticas recomendadas para usar ISFILTERED e ISINSCOPE sin dejar de respetar las reglas de RLS?
¡Gracias de antemano por su ayuda!
8 Replies
- Syndicate_Admin
Administrator
Hola @MedIDRI
Comportamiento de la función con el caso de uso de RLSFILTRADO Opera dentro de RLS Compruebe si una columna específica tiene algún filtro aplicado (por ejemplo, segmentaciones, RLS). ISINSCOPE Opera dentro de RLS Compruebe si una columna forma parte del contexto de agrupación o jerarquía. Creo que trabajé con estos filtros en el pasado con RLS y me funcionó bien.
- Syndicate_Admin
Administrator
@MedIDRI - En mi experiencia, tanto ISFILTERED como ISINSCOPE funcionan perfectamente con RLS. Creo que debe verificar su regla RLS, porque la forma en que está usando SELECTCOLUMNS no me parece correcta.
Podría considerar reescribirlo en algo como lo que se indica a continuación, pero sin más detalles sobre el modelo y el resultado que está tratando de lograr, no está claro si esto funcionará:
VAR vendeur_filter = CALCULATETABLE ( VALUES ( 'Dim Acteur'[CdVendeur] ), 'Dim Acteur'[Email] = USERPRINCIPALNAME () ) RETURN [CdVendeur] IN vendeur_filter - Syndicate_Admin
Administrator
Hola @mark_endicott
¡Gracias por tus comentarios!
No creo que el problema esté en el RLS DAX porque en la misma medida si me quedo solo con el Calculculate encuentro el resultado correcto
I probado con este sencillo RLS : 'Dim Actor'[Correo electrónico] == USERPRINCIPALNAME()
Y sigo sin tener el resultado correcto
- Syndicate_Admin
Administrator
@MedIDRI - Si encuentras la solución con una respuesta, por favor acéptala como la solución, ayuda a otros con el mismo desafío.
- Syndicate_Admin
Administrator
Desafortunadamente, ninguna de las soluciones propuestas me permitió resolver mi problema.
Con el mismo código DAX para RLS y las mismas relaciones entre las tablas, la medida que incluye ISFILTERED e ISINSCOPE devuelve resultados incorrectos:
Po TCV RLS =SWITCH(TRUE(),
ISINSCOPE('Dim Actor'[CdSeller]) || ISINSCOPE('Dim Actor'[LbSeller]) || ISFILTERED('Dim Actor'[CdSeller]),
CALCULATE( SUM('Fact Sale'[MeasureWeightedTCV]),
'Fait vente'[TypeActeur] IN {"VRC", "VP"},
NOT(LEFT('Fait Vente' [código de función], 3) EN {"RDV", "RAV"})),
1000001
)Si bien la medida que utiliza solo CALCULATE devuelve los resultados correctos.
PO TCV RLS =
CALCULATE( SUM('Fact Sale'[MeasureWeightedTCV]),
'Fait vente'[TypeActeur] IN {"VRC", "VP"},
NOT(LEFT('Fait Vente' [código de función], 3) EN {"RDV", "RAV"}))
- Syndicate_Admin
Administrator
Hola @MedIDRI ,
¡Gracias por toda la respuesta!
Y @MedIDRI , ¿cuál es el modo de conexión de su fuente de datos? ISFILTERED e ISINSCOPE no se admiten para su uso en el modo DirectQuery cuando se usan en columnas calculadas o reglas de seguridad de nivel de fila (RLS).
Función ISFILTERED (DAX) - DAX | Microsoft Learn
Función ISINSCOPE (DAX) - DAX | Microsoft Learn
Si esta no es la razón, entonces tal vez necesitemos un modelo de datos más detallado para determinar la causa del problema. ¡Gracias!
Saludos
Dino Tao
Si esta publicación ayuda, considere Acéptalo como la solución para ayudar a los demás miembros a encontrarlo más rápidamente. - Syndicate_Admin
Administrator
@MedIDRI - si usa una regla de RLS como con DAX, no debería necesitar relaciones porque la regla de DAX crea un filtro virtual.
Esto me indica que, o bien la regla de RLS de DAX se está aplicando en la tabla incorrecta o bien las relaciones la están cancelando.
Si su medida funciona cuando solo usa la sección CALCULE, esto solo indica que la medida devuelve los resultados correctos.
Esto no indica que ISINSCOPE o ISFILTERED no sean compatibles con RLS, que lo son (excepto en una tabla DQ, como señala @v-junyant-msft ).
Y para mí, esto indica que su regla de RLS en sí, o la implementación de la misma, no está funcionando como se desea.
Si puede compartir su PBIX o algunos datos de muestra y un diagrama de su modelo (para permitirme replicarlo), puedo investigar más a fondo. Pero sin nada de esto, no se pueden hacer más sugerencias.
- Syndicate_Admin
Administrator
Hola @v-junyant-msft
¡Gracias por su respuesta
Estoy usando un origen de datos de SQL Server en modo de importación y tengo un modelo de esquema de estrella con una cardinalidad de 1 a muchos, con filtrado de una sola dirección desde la tabla de dimensiones a la tabla de hechos. El RLS que he creado está en el nivel de mi tabla de dimensiones, y la columna en la que aplico el filtro es la misma que utilizo en ISFILTERED e ISINSCOPE dentro de mi medida.
Saludos