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

The Power BI Data Visualization World Championships is back! It's time to submit your entry. Live now!

Reply
Anonymous
Not applicable

RLS con condiciones relacionadas en varias tablas

Hola a todos

mi problema es la creación de roles en RLS con condiciones basadas en 2 tablas diferentes. Estas condiciones deben estar vinculadas y no pueden estar divididas. Es muy importante para mí resolverlo, realmente necesito una solución.

Conozco RLS y sé que funciona con las condiciones AND al crear filtros en diferentes tablas, pero necesito un poco más porque las condiciones en una de mis tablas se basan en campos de la otra.

Vamos a tener algunos datos de muestra sobre los envíos:

Tabla A

KeyaRemitenteReceptorValor
X1AB10
X2AC20
X3BA30
X4CB40

Tabla B

KeyBKeyaPermiso del remitentePermiso del receptor
Y1X110
Y2X201
Y3X311
Y4X410

En este caso, quiero que la persona A vea los 3 envíos de los que forma parte en la Tabla A (X1, X2, X3) pero puede ver los registros en la Tabla B solo si tiene los derechos para hacerlo en función del rol en el envío (remitente o receptor). Por ejemplo, puede ver Y1 porque es el remitente del envío y el permiso del remitente es 1 para Y1, pero no puede ver Y2 porque aquí el permiso del remitente es 0, mientras que puede ver de nuevo Y3 porque es el permiso de receptor y receptor en 1 allí.

Así que al crear el rol para la persona A en RLS, sería:

En el cuadro A

Remitente : "A" ? Receptor : "A"

En la Tabla B algo así como:

(Remitente : "A" && Permiso del remitente n.o 1) (Receptor : "A" && Permiso del receptor n.o 1)

Pero para la condición en el cuadro B necesito confiar en el campo de la Tabla A, que creo que no está permitido. No puedo evitar relacionarme con la Tabla A al escribir condiciones en la Tabla B!

¿Cómo puedo arreglarlo?

Es extremadamente importante para mí, tanto en realidad.

Por favor, ayúdame, y gracias de antemano!

2 ACCEPTED SOLUTIONS
Anonymous
Not applicable

Hola @nick46,

Puede intentar utilizar la siguiente expresión para crear un rol en tableA para filtrar registros en función de dos condiciones de tabla:

VAR CurrUser = "A"
VAR rList =
    CALCULATETABLE (
        VALUES ( TA[KeyA] ),
        FILTER ( ALLSELECTED ( TA ), [Receiver] = CurrUser )
    )
VAR sList =
    CALCULATETABLE (
        VALUES ( TA[KeyA] ),
        FILTER ( ALLSELECTED ( TA ), [Sender] = CurrUser )
    )
VAR tblist =
    CALCULATETABLE (
        VALUES ( TB[KeyA] ),
        FILTER (
            ALLSELECTED ( TB ),
            OR (
                [KeyA] IN rList
                    && [Receiver Permission] <> 0,
                [KeyA] IN sList
                    && [Sender Permission] <> 0
            )
        )
    )
RETURN
    [KeyA] IN tblist

10.png
saludos

Xiaoxin Sheng

View solution in original post

Anonymous
Not applicable

Gracias @v-shex-msft por tu pista,

por desgracia, necesito crearlo para muchos papeles y no sólo para 1 o 2. Si tomaré lo que quieres decir, tu idea es buena pero tendría que crear una nueva mesa (creo) para cada papel y es imposible para mí.

Por @lbendlin,gracias de nuevo, su respuesta es buena y habría funcionado a través de columnas calculadas, lo malo es que mi modelo de datos no es tan fácil: Tengo una tabla intermedia entre el 2 porque habrían estado en una relación M-N mientras que el uso de Intermedio obtengo 2 relación más fácil que son 1-M y 1-N. Así que no puedo usar columnas calculadas, incluso si su sugerencia es buena, mi mala no representar mi modelo correctamente.

Al final agregué las columnas que necesitaba en la Tabla B y edité mi función ETL que inserta datos en mis tablas para obtener una copia de esas columnas donde las necesito. No es justo, pero funcionó.

¡Gracias de nuevo chicos!

View solution in original post

3 REPLIES 3
Anonymous
Not applicable

Hola @nick46,

Puede intentar utilizar la siguiente expresión para crear un rol en tableA para filtrar registros en función de dos condiciones de tabla:

VAR CurrUser = "A"
VAR rList =
    CALCULATETABLE (
        VALUES ( TA[KeyA] ),
        FILTER ( ALLSELECTED ( TA ), [Receiver] = CurrUser )
    )
VAR sList =
    CALCULATETABLE (
        VALUES ( TA[KeyA] ),
        FILTER ( ALLSELECTED ( TA ), [Sender] = CurrUser )
    )
VAR tblist =
    CALCULATETABLE (
        VALUES ( TB[KeyA] ),
        FILTER (
            ALLSELECTED ( TB ),
            OR (
                [KeyA] IN rList
                    && [Receiver Permission] <> 0,
                [KeyA] IN sList
                    && [Sender Permission] <> 0
            )
        )
    )
RETURN
    [KeyA] IN tblist

10.png
saludos

Xiaoxin Sheng

Anonymous
Not applicable

Gracias @v-shex-msft por tu pista,

por desgracia, necesito crearlo para muchos papeles y no sólo para 1 o 2. Si tomaré lo que quieres decir, tu idea es buena pero tendría que crear una nueva mesa (creo) para cada papel y es imposible para mí.

Por @lbendlin,gracias de nuevo, su respuesta es buena y habría funcionado a través de columnas calculadas, lo malo es que mi modelo de datos no es tan fácil: Tengo una tabla intermedia entre el 2 porque habrían estado en una relación M-N mientras que el uso de Intermedio obtengo 2 relación más fácil que son 1-M y 1-N. Así que no puedo usar columnas calculadas, incluso si su sugerencia es buena, mi mala no representar mi modelo correctamente.

Al final agregué las columnas que necesitaba en la Tabla B y edité mi función ETL que inserta datos en mis tablas para obtener una copia de esas columnas donde las necesito. No es justo, pero funcionó.

¡Gracias de nuevo chicos!

lbendlin
Super User
Super User

No muestra el modelo de datos.

Supongamos que hay una relación 1:M de la tabla A a la tabla B. El RLS debe "simplemente trabajar" o puede crear una columna calculada en la tabla B que extraiga una columna relacionada en la tabla A (a través de RELATED( ) ). Eso le permitirá aplicar la regla RLS en la tabla B.

Helpful resources

Announcements
FabCon Atlanta 2026 carousel

FabCon Atlanta 2026

Join us at FabCon Atlanta, March 16-20, for the ultimate Fabric, Power BI, AI and SQL community-led event. Save $200 with code FABCOMM.