Tenho a seguinte tabela calculada:
MyCalculatedTable =
DISTINCT (
SELECTCOLUMNS (
FILTER (
'Dim A',
LEFT('Dim A'[Group],1) = "B" &&
LEFT('Dim A'[Id],1) <> "C" &&
'Dim A'[Code Type] IN {"A", "Y"}
),
"Group", 'Dim A'[Group]
)
)
Estou aplicando RLS no Dim A e, claro, outras tabelas vinculadas ao Dim A, como tabelas de fatos, então, neste caso, o RLS não será aplicado, pois a tabela é gerada durante o carregamento/atualização de dados, não dinamicamente durante o tempo de consulta. Portanto, a tabela calculada em si não herda automaticamente o RLS das tabelas subjacentes, a menos que a tabela calculada seja filtrada diretamente por essas tabelas durante a visualização do relatório.
Então como devo proceder dessa maneira?
O que pensei foi criar um relacionamento de 1 para muitos entre a tabela calculada MyCalculatedTable e o Dim A com base na coluna Grupo e definir a direção do filtro cruzado como Ambos e marcar a opção Aplicar filtro de segurança em ambas as direções.
Tenho uma medida que se baseia na tabela calculada:
Amount Paid =
CALCULATE (
SUM('Fact A'[Amount Paid]),
FILTER (
'Fact A',
RELATED('Dim B'[Invoice Number]) IN VALUES('MyCalculatedTable'[Group])
)
)
Eu tenho um palpite de que o RLS será aplicado automaticamente quando a medida for avaliada em um relatório. Isso ocorre porque as medidas são calculadas em tempo real com base nos dados visíveis para o usuário, e o RLS é imposto neste ponto.
Você está correto em seu processo de pensamento.
MyCalculatedTable
tabela e aDim A
tabela naGroup
coluna.Both
e marqueApply security filter in both directions
.Quando RLS é aplicado à
Dim A
tabela, aMyCalculatedTable
tabela será filtrada, portanto, oVALUES('MyCalculatedTable'[Group])
na medida também será filtrado. Isso resultará em umSUM('Fact A'[Amount Paid])
valor filtrado.