Join us at FabCon Atlanta from March 16 - 20, 2026, for the ultimate Fabric, Power BI, AI and SQL community-led event. Save $200 with code FABCOMM.
Register now!The Power BI Data Visualization World Championships is back! It's time to submit your entry. Live now!
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
| Keya | Remitente | Receptor | Valor |
| X1 | A | B | 10 |
| X2 | A | C | 20 |
| X3 | B | A | 30 |
| X4 | C | B | 40 |
Tabla B
| KeyB | Keya | Permiso del remitente | Permiso del receptor |
| Y1 | X1 | 1 | 0 |
| Y2 | X2 | 0 | 1 |
| Y3 | X3 | 1 | 1 |
| Y4 | X4 | 1 | 0 |
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!
Solved! Go to Solution.
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
saludos
Xiaoxin Sheng
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!
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
saludos
Xiaoxin Sheng
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!
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.