A data engineer writes a row filter function whose body tests group membership with is_member('analysts') and attaches it to a Unity Catalog table. In the workspace where the analysts group was originally created, members of that group read the expected rows. In a second workspace attached to the same metastore, members of the identity provider group named analysts receive an empty result from the same table, and no grant is missing. What explains this, and what should the engineer change?
CREATE FUNCTION prod.sales.region_filter(region STRING)
RETURN is_member('analysts') OR region = 'EMEA';- AA row filter is registered against the workspace where the ALTER TABLE statement ran, so it must be attached again from the second workspace before members there are evaluated against it.
- BThe group is missing USE CATALOG on the catalogue in the second workspace, which causes the filter to evaluate as false and quietly return no rows to those members.
- CMembers of the group need EXECUTE on the filter function in the second workspace, and without it the function returns false for them rather than raising a privilege error.
- Dis_member tests membership of a workspace local group, so it evaluates as false in the second workspace. Rewrite the body with is_account_group_member so that the account level group is tested instead. Correct
Why A is wrong: Tempting because the failure is workspace specific, but a row filter is a property of the Unity Catalog table and is enforced from every workspace that reaches the metastore. Reattaching it would change nothing about the membership test.
Why B is wrong: Tempting because a missing traversal privilege is a common cause of unexpected read failures, but its symptom is a permission error naming the object, not a successful query that returns zero rows.
Why C is wrong: Tempting because functions do carry an EXECUTE privilege, but a row filter function is invoked by the governance layer on behalf of the reader, and a genuine privilege shortfall would surface as an error rather than as silent exclusion.
Why D is correct: The two functions look interchangeable but resolve membership at different levels. Only the account level test is consistent for every workspace sharing the metastore, which is why the recommended form for a filter or mask is is_account_group_member.