Conceder denegar el apilamiento de permisos

9

Para el rol db_denycustomer, solo quiero que el código de columna de la tabla del cliente sea SELECCIONABLE, y ninguno de los otros. Entonces hice esto:

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

... y funciona bien. ¡Frio! Pero, ¿por qué ?

Lo que he leído en artículos relacionados es que los permisos se acumulan, pero DENYtienen prioridad. Por el contrario, en mi caso, parece que la última "consulta" de permisos tuvo prioridad. Efectivamente, si los ejecuto en orden inverso, este último también DENYoculta la columna de código.

¿Podría por favor elaborar sobre esto?

También he incluido los valores predeterminados db_datawritery los db_datareaderroles para el usuario con el que probé.

George Menoutis
fuente

Respuestas:

10

Este es un comportamiento documentado proporcionado para la compatibilidad con versiones anteriores. Extracto de documentación:

Precaución Un DENY de nivel de tabla no tiene prioridad sobre un GRANT de nivel de columna. Esta inconsistencia en la jerarquía de permisos se ha preservado para la compatibilidad con versiones anteriores.

Dan Guzman
fuente