Eu tenho uma tabela estruturada da seguinte maneira (simplificada)
Name, EMail, LastLoggedInAt
Eu tenho um usuário no SQL Server (RemoteUser) que só pode ver dados (por meio de uma consulta de seleção) em que o campo LastLoggdInAt não é nulo.
Parece que eu posso fazer isso? É possível?
Respostas:
O modelo de segurança do SQL Server permite conceder acesso a uma exibição sem conceder acesso às tabelas subjacentes.
Como o código de exemplo é uma ótima maneira de mostrar um conceito, considere o seguinte, com uma
LoginDetails
tabela e a visualização correspondente:Criaremos um logon e um usuário, em seguida, atribuiremos a esse usuário os direitos para selecionar linhas da exibição, sem ter direitos para exibir a tabela em si.
Agora, vamos inserir duas linhas de teste:
Isso testa o modelo de segurança. A primeira
SELECT
instrução é bem-sucedida, pois é selecionada na visualização, enquanto a segundaSELECT
instrução falha porque o usuário não tem acesso direto à tabela.Observe que os resultados da exibição excluem a linha em que o
LastLoggedInAt
valor estáNULL
, conforme necessário em sua pergunta.A segunda
SELECT
instrução na tabela subjacente retorna um erro:Limpar:
Como alternativa, se você tiver o SQL Server 2016 ou mais recente, poderá usar um predicado de segurança no nível da linha para impedir que certos usuários vejam linhas com um
LastLoggedInAt
valor NULL .Primeiro, criamos a tabela, um logon, um usuário para esse logon e concedemos acesso à tabela:
Em seguida, inserimos algumas linhas de amostra. Uma linha com um valor nulo
LastLoggedInAt
e outra com um valor não nulo para essa coluna.Aqui, estamos criando uma função com valor de tabela vinculada ao esquema que retorna uma linha com 0 ou 1, dependendo do valor das variáveis
@LastLoggedInAt
e@username
que são passadas para a função. Essa função será usada por um predicado de filtro para eliminar as linhas que queremos ocultar de certos usuários.Este é o filtro de segurança que elimina as linhas das
SELECT
instruções executadas nadbo.LoginDetails
tabela:O filtro acima usa a
dbo.fn_LoginDetailsRemoteUserPredicate
função passando o nome do usuário atual, juntamente com os valores de cada linha daLastLoggedInAt
coluna dadbo.LoginDetails
tabela.Se consultarmos a tabela como um usuário normal:
vemos todas as linhas:
No entanto, se testarmos como
RemoteUser
:vemos apenas linhas "válidas":
E limpamos:
Esteja ciente de que a ligação de um esquema a uma função dessa tabela impossibilita modificar a definição da tabela sem primeiro descartar o predicado do filtro e a
dbo.fn_LoginDetailsRemoteUserPredicate
função.fonte
LastLoggedInAt
coluna.