2010-03-28 17 views
10

Przy użyciu programu SQL Server 2008 istnieje sposób zezwalania na wstawianie do tabeli tylko za pośrednictwem procedury składowanej, a jeśli tak, to w jaki sposób?Wymuszenie INSERT tylko za pomocą procedury przechowywanej

EDIT:
Najlepszym sposobem jest prawdopodobnie sugestia Martina Smitha użyć INSTEAD OF INSERT spust. Bezpośrednią odpowiedzią na to pytanie jest marc_s 'one with GRANT and DENY, choć nie ogranicza to niektórych kont użytkowników.

+0

Możliwa duplikat [procedura składowana i pozwoleń - Czy EXECUTE wystarczająco ?] (http://stackoverflow.com/questions/3815411/stored-procedure-and-permissions-is-execute-enough) –

Odpowiedz

9

Po prostu nie nadawaj użytkownikom bazy danych (i swojej roli "publicznej") uprawnienia WSTAW na stole.

Przyznaj tym użytkownikom uprawnienia do wykonywania zapisanego procesu INSERT - w ten sposób mogą wywołać zapisany proces, ale nie mogą bezpośrednio wstawić żadnych danych do tabeli podstawowej.

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

To jest tylko * sposób ... zakładając, że połączenie nie jest db_owner lub sysadmin ... – gbn

+0

To nie działa dla mnie. Dostaję 'Odmowa uprawnień INSERT na obiekcie ...' nawet gdy wykonuję procedurę przechowywaną, która wykonuje INSERT. Używam SQL 2012. Ach, właśnie dowiedziałem się, że to dlatego, że ta odpowiedź nie zadziała, jeśli INSERT jest wykonywany z dynamicznego SQL wewnątrz proc. –

6

Odmów INSERT uprawnienia do tabeli i nadaj uprawnienie WYKONAJ procedurze przechowywanej.

2

Użyj uprawnień (dotacji). Utwórz plik SP i nadaj mu prawa do określonego użytkownika lub roli. Następnie odrzuć insert bezpośrednio na stole i powinieneś być cały zestaw.

4

Na czym polega motywacja? Czy dzieje się tak dlatego, że procedura składowana zawiera pewną logikę, na którą polegasz, gdy dane są wstawiane? Jeśli tak, możesz użyć wyzwalacza do enkapsulacji tej logiki.

Jeśli to nie jest odpowiednie i chcesz uniemożliwić nawet użytkownikom o uprawnieniach administratora prawo do wstawiania bezpośrednio do tabeli, to nie możesz, ale możesz się upewnić, że nie stało się to przypadkowo, używając wyzwalacza INSTEAD OF INSERT że zgłosi błąd i wycofuje chyba pewna wartość CONTEXT_INFO ustawiono następnie czyści CONTEXT_INFO The (procedura składowana może ustawić to do wartości oczekiwanej)

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

Powiązane problemy