Accorder le refus d'empiler les autorisations

9

Pour le rôle db_denycustomer, je veux que seul le code de colonne de la table client soit SELECTable, et aucun des autres. Alors j'ai fait ça:

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

... et ça marche bien. Cool! Mais pourquoi ?

Ce que j'ai lu dans des articles connexes, c'est que la pile d'autorisations, mais DENYa priorité. En revanche, dans mon cas, il semble que la dernière "requête" d'autorisation ait eu la priorité. Effectivement, si je les exécute dans l'ordre inverse, ce dernier DENYmasque également la colonne de code.

Peux tu développer ta pensée à ce propos?

J'ai également inclus la valeur par défaut db_datawriteret les db_datareaderrôles pour l'utilisateur avec lequel j'ai testé.

George Menoutis
la source

Réponses:

10

Il s'agit d' un comportement documenté fourni pour la compatibilité descendante. Extrait de documentation:

Attention Un DENY de niveau table n'a pas la priorité sur un GRANT de niveau colonne. Cette incohérence dans la hiérarchie des autorisations a été préservée pour des raisons de compatibilité descendante.

Dan Guzman
la source