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!To celebrate FabCon Vienna, we are offering 50% off select exams. Ends October 3rd. Request your discount now.
We're implementing RLS on a semantic model sourced from a Fabric Lakehouse. For one fact table, we assigned a security filter as FALSE() to fully restrict access to that table for a specific group.
Here’s what we observe:
In Excel and Power BI, when a user with no access opens the report, they see blank visuals instead of an error (e.g., "you do not have access to this data").
We expected either an error message or some clear indicator of denied access.
RLS is confirmed working because when switching to an allowed user, the correct data appears.
The semantic model is deployed in Power BI Service, and we are using USERPRINCIPALNAME() or USERNAME() for security testing.
Question: Is this the expected behavior when using FALSE()?
Is there any way to surface a visible error/warning to users when RLS blocks their access?
Any insights or suggestions for the feedback are greatly appreciated.
Thank you!
Solved! Go to Solution.
Hi @SylviaFeng,
You are seeing the expected behavior.
RLS filters rows; it does not throw access errors. When a role’s filter evaluates to FALSE() on a table, that table simply returns zero rows for that user, so visuals render blank in both Power BI and Excel. That is by design: RLS is a row filter, not an object permission system, and DAX cannot detect that RLS is in effect. See Microsoft’s guidance: RLS “filters table rows; [it] can’t be configured to restrict access to model objects,” and a rule that evaluates to FALSE returns no rows. DAX also “can’t even determine that RLS is enforced.” (docs) RLS is also honored in Analyze in Excel and the Excel Power BI add-in, so blanks there are expected too (docs; see Considerations and limitations where it confirms RLS/OLS are supported).
If you want a visible message instead of silent blanks, you have a few options:
IsAuthorized = IF ( COUNTROWS ( Security ) > 0, 1, 0 ) AccessMessage = IF ( [IsAuthorized] = 0, "You do not have access to this data. Please contact the owner if you believe this is an error.", BLANK() )
If you found this helpful, consider giving some Kudos. If I answered your question or solved your problem, mark this post as the solution.
Hi @SylviaFeng,
Thank you @tayloramy for your response.
Has your issue been resolved?
If the response provided by the community member addressed your query, could you please confirm? It helps us ensure that the solutions provided are effective and beneficial for everyone.
Thank you for your understanding!
Hi @SylviaFeng,
Just wanted to follow up and confirm that everything has been going well on this. Please let me know if there’s anything from our end.
Please feel free to reach out Microsoft fabric community forum.
Hi @SylviaFeng,
Just wanted to follow up and confirm that everything has been going well on this. Please let me know if there’s anything from our end.
Please feel free to reach out Microsoft fabric community forum.
Hi @SylviaFeng,
You are seeing the expected behavior.
RLS filters rows; it does not throw access errors. When a role’s filter evaluates to FALSE() on a table, that table simply returns zero rows for that user, so visuals render blank in both Power BI and Excel. That is by design: RLS is a row filter, not an object permission system, and DAX cannot detect that RLS is in effect. See Microsoft’s guidance: RLS “filters table rows; [it] can’t be configured to restrict access to model objects,” and a rule that evaluates to FALSE returns no rows. DAX also “can’t even determine that RLS is enforced.” (docs) RLS is also honored in Analyze in Excel and the Excel Power BI add-in, so blanks there are expected too (docs; see Considerations and limitations where it confirms RLS/OLS are supported).
If you want a visible message instead of silent blanks, you have a few options:
IsAuthorized = IF ( COUNTROWS ( Security ) > 0, 1, 0 ) AccessMessage = IF ( [IsAuthorized] = 0, "You do not have access to this data. Please contact the owner if you believe this is an error.", BLANK() )
If you found this helpful, consider giving some Kudos. If I answered your question or solved your problem, mark this post as the solution.