Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 

Be one of the first to start using Fabric Databases. View on-demand sessions with database experts and the Microsoft product team to learn just how easy it is to get started. Watch now

Reply
Syndicate_Admin
Administrator
Administrator

Múltiples dimensiones de juego de rol y RLS

Hola

He navegado por las preguntas existentes durante un tiempo, pero hasta ahora no he visto mi problema, y ChatGPT me está dando la vuelta hasta ahora, así que pensé en publicar mi pregunta. Tiene que ver con la intersección de las dimensiones de juego de roles múltiples y el RLS.

En mi modelo de datos, tengo una tabla de hechos en la que la ubicación se usa de dos maneras: digamos location_departure y location_arrival. Tengo una tabla de dimensiones separada que contiene todos los valores de ubicación. Dado que necesito filtrar o interactuar con la tabla de hechos mediante la ubicación en ambos campos y no puedo tener dos relaciones activas, y porque esta tabla de dimensiones es relativamente pequeña, la copié mediante Referencia en Power Query, por lo que ahora tengo dos tablas idénticas que pueden filtrar por location_departure y location_arrival, respectivamente. Hasta aquí todo bien, y esto funciona muy bien para un usuario con acceso a todos los datos.

Sin embargo, necesito que RLS restrinja a los usuarios solo a las ubicaciones permitidas. Por lo tanto, agregué un rol usando USERPRINCIPALNAME() que verifica el usuario en cada una de las tablas de dimensiones location_departure y location_arrival tablas. Eso también funciona hasta ahora.

El problema se convierte en cómo RLS filtra la tabla de hechos. Necesito que los usuarios tengan acceso a los registros de la tabla de hechos cuando el valor de ubicación del usuario coincida con location_departure OR location_arrival. Esto es a lo que me gustaría que un usuario tuviera acceso:

jmunn_2-1734037124510.png

Pero la forma en que está funcionando ahora, es aplicar ambos filtros a la tabla de hechos para que los únicos registros disponibles para el usuario sean aquellos en los que los valores location_departure y location_arrival sean los mismos:

jmunn_3-1734037163539.png

Entiendo lo que está pasando, pero no puedo encontrar una manera de evitar este problema. ¿Alguna ayuda o idea sobre un enfoque diferente?

Gracias por cualquier información.

9 REPLIES 9
Syndicate_Admin
Administrator
Administrator

Gracias por su solución AMeyersen y lbendlin

Hola, @jmunn

Le deseo todo lo mejor. El superusuario y AMeyersen del foro anterior han proporcionado soluciones para ayudarlo a resolver el problema. Veo que AMeyersen proporciona capturas de pantalla detalladas y expresiones DAX, me gustaría confirmar, ¿ha resuelto con éxito este problema o necesita más ayuda?
En caso afirmativo, puede compartir su solución alternativa y marcarla como una solución para que otros usuarios también puedan beneficiarse. Si encuentra una respuesta particularmente útil para usted, también puede marcarla como una solución.
Si aún tienes alguna pregunta o necesitas más apoyo, puedes preguntarlo en un nuevo post y estaremos más que felices de seguir ayudándote.

Saludos

Jianpeng Leer

Hola @v-jianpeng-msft, mis disculpas por no haber respondido antes.

Actualmente estoy intentando las ideas que @AMeyersen y @lbendlin sugerido, así que no estoy seguro de si necesito más ayuda o no. Responderé a cada uno de ellos directamente.

Hola @jmunn ,

En el enfoque habitual para configurar un esquema de estrella, la tabla de hechos no filtraría las tablas de dimensiones.
Puede probar utilizando una relación bidreccional entre la tabla de hechos y las tablas de dos dimensiones. Asegúrese de marcar "habilitar filtro de seguridad en ambas direcciones" en la configuración de la relación.

De este modo, los usuarios solo verán los valores de dimensión que sean relevantes para ellos. No estoy seguro de las penalizaciones de rendimiento en este enfoque. Eso es algo que tendrías que probar.

Syndicate_Admin
Administrator
Administrator

Hola @jmunn ,
si no es necesario aplicar RLS a las dimensiones (los usuarios pueden ver todos los valores de dimensión), puede usar un enfoque mucho más sencillo.

  1. Desconecte la tabla RLS de ambas tablas de dimensiones
    AMeyersen_0-1734081513706.png

  2. Actualice la instrucción RLS mediante el editor avanzado y filtre directamente en la tabla de hechos
    AMeyersen_1-1734081621955.png

  3. use una instrucción como esta para RLS:

OR (
    [Location_Arrival]
        == LOOKUPVALUE ( 'RLS-Table'[Location], 'RLS-Table'[Email], USERPRINCIPALNAME () ),
    [Location_Departure]
        == LOOKUPVALUE ( 'RLS-Table'[Location], 'RLS-Table'[Email], USERPRINCIPALNAME () )
)​

Si se pueden asignar varias ubicaciones a un solo usuario, la instrucción DAX tendría un aspecto similar al siguiente:

VAR _locations =
    SELECTCOLUMNS (
        CALCULATETABLE ( 'RLS-Table', 'RLS-Table'[Email] = USERPRINCIPALNAME () ),
        [Location]
    )
RETURN
    OR ( [Location_Arrival] IN _locations, [Location_Departure] IN _locations )

¡Gracias @AMeyersen!

Re: ya sea que los usuarios puedan ver todos los valores de dimensión o no: hay ~ 1700 valores de dimensión en total, por lo que sería algo engorroso para un usuario tener que navegar entre ellos, incluso con la búsqueda habilitada en la segmentación. Sin embargo, si entiendo correctamente el enfoque sugerido, ¿la tabla de hechos ahora filtrada por RLS debería poder filtrar las tablas de dos dimensiones de todos modos?

Tenía otra pregunta con respecto a esta solución re: aplicar RLS a la tabla de hechos directamente: Existe la posibilidad de que mi modelo de datos eventualmente crezca para incluir tablas de hechos adicionales. ¿Esta solución se extendería también a esas tablas de hechos, o tendrían que filtrar por relación con la tabla de hechos actual?

Hola, @jmunn

Basándome en la imagen que mostraste al final, he creado un conjunto de datos sencillo:

vjianpengmsft_0-1734588409236.png

Mi relación es la siguiente:

vjianpengmsft_1-1734588438759.png

Creé un rol de RLS de la siguiente manera:

vjianpengmsft_2-1734588480972.png

vjianpengmsft_3-1734588488527.png

HECHO Tabla DAX:

VAR _user_location = MAXX(FILTER('UserInfo','UserInfo'[Email] = USERPRINCIPALNAME()),'UserInfo'[Location])
VAR _table = SELECTCOLUMNS(CALCULATETABLE('REF',FILTER('REF','REF'[Location] = _user_location)),'REF'[DepartmentArrivalCombination])
RETURN 'FACT'[DepartmentArrivalConcatenated] IN _table

Ser capaz de obtener los resultados que esperas:

vjianpengmsft_4-1734588608794.png

He subido el archivo PBIX que usé esta vez a continuación.

Saludos

Jianpeng Leer

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
Administrator

I need users to have access to records in the fact table when the user's location value matches either location_departure OR location_arrival.

Cree una tabla de referencia que enumere todas las combinaciones de su tabla de datos para la salida y la llegada.

Cree otra tabla de referencia con todas las ubicaciones.

Controle la tabla de ubicaciones desde el RLS.

Controle la tabla de combinaciones desde la tabla de ubicaciones

Controle la tabla de hechos desde la tabla de combinaciones.

Gracias @lbendlin por esto.

Estoy tratando de averiguar cómo funcionaría eso:

jmunn_1-1734060757746.png

En este enfoque, parece que para cada ubicación, la tabla de combinaciones debe incluir un registro para cada combinación en la que esté involucrada esa ubicación, salida y/o llegada.

¿Es esto lo que tenías en mente?

Proporcione datos de muestra que cubran completamente su problema.

Helpful resources

Announcements
Las Vegas 2025

Join us at the Microsoft Fabric Community Conference

March 31 - April 2, 2025, in Las Vegas, Nevada. Use code MSCUST for a $150 discount!

Dec Fabric Community Survey

We want your feedback!

Your insights matter. That’s why we created a quick survey to learn about your experience finding answers to technical questions.

ArunFabCon

Microsoft Fabric Community Conference 2025

Arun Ulag shares exciting details about the Microsoft Fabric Conference 2025, which will be held in Las Vegas, NV.

December 2024

A Year in Review - December 2024

Find out what content was popular in the Fabric community during 2024.

Top Solution Authors
Top Kudoed Authors