Estou tentando converter a seguinte função de segurança em nível de linha SQL em um filtro DAX em um modelo tabular
CREATE FUNCTION [Security].[fn_securitypredicate](@BrandID AS INT, @ChannelId AS INT)
RETURNS TABLE
WITH SCHEMABINDING
AS
RETURN
(SELECT 1 AS fn_securitypredicate
WHERE (EXISTS ( SELECT 1 FROM security.RLSStaffBrand WHERE StaffUsername = SYSTEM_USER AND BrandId = @BrandID)
AND EXISTS ( SELECT 1 FROM security.RLSStaffChannel WHERE StaffUsername = SYSTEM_USER AND ChannelId = @ChannelID) )
OR ( EXISTS (SELECT 1 FROM security.RLSStaffBrand WHERE StaffUsername = SYSTEM_USER AND BrandId = @BrandID)
AND NOT EXISTS ( SELECT 1 FROM security.RLSStaffChannel WHERE StaffUsername = SYSTEM_USER ) )-- this user is not restricted by Channel
OR (NOT EXISTS ( SELECT 1 FROM security.RLSStaffBrand WHERE StaffUsername = SYSTEM_USER)
AND EXISTS ( SELECT 1 FROM security.RLSStaffChannel
WHERE StaffUsername = SYSTEM_USER AND ChannelId = @ChannelID) )
)
GO
Até agora eu tenho os seguintes filtros DAX, mas isso só lida com a primeira condição no código SQL. Não sei se é possível replicar o resto no DAX.
='Brand'[BrandId]=LOOKUPVALUE('RLSStaffBrand'[BrandId], 'RLSStaffBrand'[StaffUsername], USERNAME(), 'RLSStaffBrand'[BrandId], 'Brand'[BrandId])
='Channel'[ChannelId]=LOOKUPVALUE('RLSStaffChannel'[ChannelId], 'RLSStaffChannel'[StaffUsername], USERNAME(), 'RLSStaffChannel'[ChannelId], 'Channel'[ChannelId])
Não é uma resposta exata para sua pergunta, mas em vez de traduzir o SQL para DAX e mantê-lo em dois lugares, você pode reutilizar a lógica SQL em sua implementação RLS para materializar tabelas em seu modelo tabular com os pares permitidos (Nome de usuário, BrandId), e os pares permitidos (Username,ChannelId) enumerados.
Então escreva uma visão e carregue uma tabela em seu modelo tabular com os resultados de uma consulta como esta:
Que enumerará todas as combinações permitidas de (BrandId, ChannelId, StaffUserName). Em seguida, use essa nova tabela em seus filtros de linha DAX configurando a filtragem cruzada bidirecional entre esta tabela e Marca e esta tabela e Canal.
Davi