2011-12-14 3 views
6

SQL Server 2008 R2: normalement, nous créons notre table et la procédure stockée et accordons à un utilisateur des droits d'exécution sur la procédure stockée. Nous ne devons jamais accorder des droits spécifiques aux tables ou aux vues car si l'utilisateur peut exécuter la procédure stockée, SQL Server déduit que la procédure stockée doit être autorisée à exécuter les instructions select/insert/update. Fonctionne bien parce que nous ne traitons qu'un seul schéma, mais maintenant nous avons un scénario où les tables sont dans un schéma, mais une procédure stockée est dans un autre. Lorsque l'utilisateur exécute la procédure stockée, ils obtiennent une erreur:procédure stockée appelant des données dans un schéma différent

Msg 229, Level 14, State 5, Procedure teststoredprocedure, Line 7 The SELECT permission was denied on the object 'testtable', database 'testdatabase', schema 'testschema'.

teststoredprocedure est dans un schéma différent de celui testtable. Est-il possible d'autoriser la procédure stockée à sélectionner à partir de tables, sans accorder à l'utilisateur des droits spécifiques sur ces tables?

+0

Si une réponse a été correcte ou utile, veuillez accepter ou confirmer. – Ben

Répondre

2

Vous devez donner au propriétaire de la procédure stockée WITH GRANT accès à la table .

En général, un schéma appartient à un rôle du même nom que le schéma, afin de permettre storedprocschema.teststoredprocedure d'accéder à la table, il serait:

GRANT SELECT on testschema.testtable TO storedprocschema WITH GRANT 

Cela devrait fonctionner si et seulement si la table est en la même base de données que le proc.

Pour obtenir le même résultat avec une table dans une autre base de données, vous pouvez:

  • Activer « Cross propriété de base de données Enchaînement »

  • Déplacer la procédure à l'autre base de données, et un procédure shim dans la base de données d'origine qui l'appelle. Ensuite, gérer les autorisations sur les deux procédures.

0

Oui, c'est possible. Voici ce que vous voulez faire:

alter procedure teststoredprocedure 
with execute as 'UserWithPermissions' 
-- rest of stored proc code 

UserWithPermissions a les autorisations nécessaires sur vos objets de base de données que vous essayez d'exécuter à nouveau les opérations CRUD.

A l'inverse, si votre base de données contexte de sécurité utilisateur dispose des autorisations nécessaires, vous pouvez utiliser le raccourci pour y parvenir ainsi:

with execute as self 
Questions connexes