Conceder negar empilhamento de permissão

9

Para a função db_denycustomer, desejo que apenas o código da coluna da tabela customer seja SELECTable e nenhum dos outros. Então eu fiz isso:

DENY SELECT ON dbo.customer TO db_denycustomer
GRANT SELECT ON dbo.customer (code) TO db_denycustomer

... e funciona bem. Legal! Mas porque ?

O que li em artigos relacionados é que as permissões são empilhadas, mas DENYtêm precedência. Por outro lado, no meu caso, parece que a última permissão "query" teve precedência. Com certeza, se eu executá-los na ordem inversa, o último também DENYoculta a coluna de código.

Você poderia, por favor, elaborar isso?

Também incluí o padrão db_datawritere as db_datareaderfunções do usuário com o qual testei.

George Menoutis
fonte

Respostas:

10

Esse é um comportamento documentado fornecido para compatibilidade com versões anteriores. Trecho da documentação:

Cuidado Um DENY no nível da tabela não tem precedência sobre um GRANT no nível da coluna. Essa inconsistência na hierarquia de permissões foi preservada para compatibilidade com versões anteriores.

Dan Guzman
fonte