Tenho um aplicativo que é multi-tenant. Então, um único banco de dados tem dados para todas as organizações que o usam.
Existe uma maneira de fornecer acesso ao banco de dados para que meus clientes possam se conectar a ele com qualquer ferramenta de análise, como o Power BI?
Há a tabela Org - onde posso especificar o PK dessa tabela que eles podem obter.
Depois, há a tabela Event, onde há um FK para a tabela Org.
E então uma tabela de inscrição (para o evento) que tem um FK para o evento e um FK para o usuário.
E o mais difícil é a tabela de usuários. Se o usuário estiver inscrito para um evento, então esse cliente pode obter esse usuário. O que significa que vários clientes podem ver essa linha da tabela de usuários.
Isto é especificamente SQL Server. Então eu precisaria criar alguma visão que determinasse quais registros de usuário um dado usuário pode visualizar. Enquanto eu poderia duplicar o Ord PK na tabela Event, o registro de usuário, como vários clientes podem obtê-lo - não funcionará com um FK adicionado.
Existe uma maneira de fazer isso?
Você deve fornecer os
CREATE
scripts de suas tabelas e alguns dados de amostra para que seja mais fácil conceituar sua estrutura de banco de dados. Além disso, de uma perspectiva de segurança, geralmente é uma prática melhor implementar um banco de dados separado por locatário.Mas, deixando tudo isso de lado, seu caso de uso se encaixa no modelo do recurso Segurança em Nível de Linha no SQL Server:
Com o Row-Level Security, você pode criar uma função com valor de tabela para aplicar a lógica de filtro com base na
Org
tabela (provavelmente) e, em seguida, criar uma política de segurança para aplicar essa função em todas as suas tabelas. Isso abstrai a lógica de segurança para que você não tenha que implementá-la manualmente com cada objeto (por exemplo, encapsulado em uma exibição para cada objeto) e refrata o código para um lugar.A segurança em nível de linha também pode ser usada para definir políticas que bloqueiam quais consultas de manipulação de dados podem ser executadas por quais usuários em tabelas específicas.
Row-Level Security não é um substituto para as melhores práticas em torno da segurança de outra forma. Ele apenas adiciona uma camada adicional de proteção que fornece lógica de filtragem automática de dados com base em quaisquer critérios relevantes que você definir com base em seus usuários finais.