2010-03-28 6 views
10

A l'aide de SQL Server 2008, existe-t-il un moyen d'autoriser les insertions à une table uniquement via une procédure stockée, et si oui, comment?Forcer INSERT uniquement via la procédure stockée

EDIT:
La meilleure façon de faire est probablement la suggestion de Martin Smith d'utiliser un déclencheur INSTEAD OF INSERT. La réponse directe à cette question est celle de marc_s avec GRANT et DENY, bien que cela ne limite pas certains comptes d'utilisateurs.

+0

double possible de [procédure stockée et autorisations - est-EXECUTE assez ?] (http://stackoverflow.com/questions/3815411/stored-procedure-and-permissions-is-execute-enough) –

Répondre

9

Juste ne pas accorder aux utilisateurs de base de données (et votre rôle "public") l'autorisation INSERT sur la table.

Accordez à ces utilisateurs la permission d'exécuter le processus stocké INSERT - de cette façon, ils peuvent appeler le proc stocké, mais ils ne peuvent pas directement insérer des données dans la table sous-jacente.

DENY INSERT ON dbo.YourTable TO PUBLIC 
GRANT EXECUTE ON dbo.InsertDataProc TO PUBLIC 
+0

Ceci est la méthode * seulement * ... en supposant que la connexion ne soit pas db_owner ou sysadmin ... – gbn

+0

Cela ne fonctionne pas pour moi. J'obtiens 'L'autorisation INSERT a été refusée sur l'objet ...' même lorsque j'exécute une procédure stockée qui fait l'INSERT. J'utilise SQL 2012. Ah, je viens d'apprendre que c'est parce que cette réponse ne fonctionnera pas si l'INSERT est fait avec SQL dynamique dans le proc. –

6

Refuser l'autorisation INSERT sur la table et accorder l'autorisation EXECUTE sur la procédure stockée.

2

Utilisez les autorisations (autorisations). Créez le SP et attribuez le droit execute à l'utilisateur ou au rôle en question. Ensuite, nier le insert à droite sur la table et vous devriez être tous ensemble.

4

Quelle est la motivation de la question? Est-ce parce que la procédure stockée contient une certaine logique que vous comptez utiliser lorsque des données sont insérées? Si c'est le cas, vous pouvez utiliser un déclencheur pour encapsuler cette logique. Si cela ne vous convient pas et que vous voulez empêcher même les personnes ayant des permissions sysadmin de les insérer directement dans la table, vous ne pouvez pas, mais vous pouvez vous assurer que cela ne se produira pas accidentellement en utilisant un déclencheur INSTEAD OF INSERT qui déclenche une erreur et annule, sauf si une certaine valeur CONTEXT_INFO est réglée efface alors la CONTEXT_INFO (Votre procédure stockée pourrait définir ce à la valeur attendue)

http://msdn.microsoft.com/en-us/library/aa214382%28SQL.80%29.aspx

Questions connexes