Tout,
Dans SQL Server, une procédure stockée (exécutée par un user) peut-elle écrire sur une table dans laquelle l'user n'a pas access directement à la table?
Rgds,
MK
La réponse correcte est NON , une procédure stockée n'a pas access à écrire dans une table. Cependant, la plupart des users le perçoivent incorrectement comme OUI à cause des strings de propriété :
Lorsque plusieurs objects de database accèdent séquentiellement, la séquence est appelée string. Bien que de telles strings n'existent pas indépendamment, lorsque SQL Server traverse les liens dans une string, SQL Server évalue les permissions sur les objects constituants différemment que s'il accédait aux objects séparément. Ces différences ont des implications importantes pour la gestion de la security. Le chaînage de propriété permet de gérer l'access à plusieurs objects, tels que plusieurs tables, en définissant des permissions sur un object, tel qu'une vue.
Ainsi, une procédure sera capable d'écrire dans une table que l'user n'a pas l'autorisation d'écrire s'il forme une string de propriété . Cela signifie que si le propriétaire du schéma qui contient la table est identique au propriétaire du schéma qui contient la procédure, une string de propriété est formée et la procédure est autorisée à écrire dans la table. Puisque la grande majorité des objects déployés dans la pratique appartiennent au schéma dbo
, une string de propriété est presque toujours formée.
Il est important de comprendre ces détails pour pouvoir résoudre les problèmes et comprendre pourquoi la procédure est autorisée à écrire dans la table. Erland Sommarskog a rédigé un excellent article sur ce sujet: Donner des permissions via des procédures stockées . Cet article explique en détail toutes les options disponibles. Votre meilleure option, bien mieux que le chaînage de propriété, est la signature de code .
Comprendre comment cela fonctionne aide également à comprendre pourquoi le SQL dynamic semble «casser»: l'exécution de SQL dynamic est une rupture automatique dans la string de propriété, qui fait disparaître toute «magie». Et cela aide aussi à comprendre pourquoi cette 'magie' semble ne pas fonctionner en dehors de la database: cross db ownership chaining La valeur par défaut de l' option est 0.
En bref, oui.
La principale ressortingction dans le jeu dans ce scénario est de savoir si l'user peut exécuter la procédure stockée.
Lors de la création de la procédure stockée, il doit être fait avec un login / user qui a l'access en écriture nécessaire à la table en question.
Oui, si l'user dispose d'permissions GRANTed EXEC sur le SP, toutes les actions qu'il effectue (dans cette database) sont autorisées.
Aller à une autre database nécessitera des permissions sur l'user sous-jacent à examiner.
En outre, le SQL dynamic embedded au SP nécessitera que l'user sous-jacent ait des permissions.