J'ai un tableau structuré comme ça (simplifié)
Name, EMail, LastLoggedInAt
J'ai un utilisateur dans SQL Server (RemoteUser) qui ne devrait pouvoir voir que les données (via une requête de sélection) où le champ LastLoggdInAt n'est pas nul.
On dirait que je peux faire ça? C'est possible?
Réponses:
Le modèle de sécurité SQL Server vous permet d'accorder l'accès à une vue sans accorder l'accès aux tables sous-jacentes.
Étant donné que l'exemple de code est un excellent moyen de montrer un concept, considérez ce qui suit, avec une
LoginDetails
table et la vue correspondante:Nous allons créer une connexion et un utilisateur, puis attribuer à cet utilisateur les droits pour sélectionner des lignes dans la vue, sans avoir le droit de visualiser la table elle-même.
Maintenant, nous allons insérer deux lignes de test:
Cela teste le modèle de sécurité. La première
SELECT
instruction réussit, car elle sélectionne dans la vue, tandis que la deuxièmeSELECT
instruction échoue parce que l'utilisateur n'a pas d'accès direct à la table.Notez que les résultats de la vue excluent la ligne où se trouve la
LastLoggedInAt
valeurNULL
, comme requis dans votre question.La deuxième
SELECT
instruction sur la table sous-jacente renvoie une erreur:Nettoyer:
Alternativement, si vous avez SQL Server 2016 ou une version plus récente, vous pouvez utiliser un prédicat de sécurité de niveau ligne pour empêcher certains utilisateurs de voir des lignes avec une
LastLoggedInAt
valeur NULL .Tout d'abord, nous créons la table, une connexion, un utilisateur pour cette connexion, et nous accordons l'accès à la table:
Ensuite, nous insérons quelques exemples de lignes. Une ligne avec une valeur nulle
LastLoggedInAt
et une avec une valeur non nulle pour cette colonne.Ici, nous créons une fonction table de valeur liée au schéma qui renvoie une ligne avec 0 ou 1 selon la valeur des variables
@LastLoggedInAt
et@username
qui sont passées dans la fonction. Cette fonction sera utilisée par un prédicat de filtre pour éliminer les lignes que nous voulons cacher à certains utilisateurs.Il s'agit du filtre de sécurité qui élimine les lignes des
SELECT
instructions exécutées sur ladbo.LoginDetails
table:Le filtre ci-dessus utilise la
dbo.fn_LoginDetailsRemoteUserPredicate
fonction en transmettant le nom de l'utilisateur actuel, ainsi que les valeurs de chaque ligne pour laLastLoggedInAt
colonne de ladbo.LoginDetails
table.Si nous interrogeons la table en tant qu'utilisateur normal:
nous voyons toutes les lignes:
Cependant, si nous testons comme
RemoteUser
:nous ne voyons que les lignes "valides":
Et nous nettoyons:
N'oubliez pas que la liaison de schéma d'une fonction à la table de cette manière ne permet pas de modifier la définition de la table sans supprimer au préalable le prédicat de filtre et la
dbo.fn_LoginDetailsRemoteUserPredicate
fonction.la source
LastLoggedInAt
colonne.