Вставить INSERT только с помощью хранимой процедуры

Используя SQL Server 2008, есть ли способ разрешить вставки в таблицу только через хранимую процедуру, и если да, то как?

EDIT:
Лучшим способом, вероятно, является предложение Мартина Смита использовать INSTEAD OF INSERT. Прямой ответ на этот вопрос - marc_s 'с GRANT и DENY, хотя он не будет ограничивать некоторые учетные записи пользователей.

Ответ 1

Просто не предоставляйте пользователям базы данных (и вашей "общедоступной" роли) разрешение INSERT в таблице.

Предоставьте этим пользователям разрешение на выполнение хранимой процедуры INSERT - таким образом, они могут вызывать сохраненный процесс, но они не могут напрямую вставлять какие-либо данные в базовую таблицу.

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

Ответ 2

Отказать INSERT разрешение на таблицу и предоставить разрешение EXECUTE для хранимой процедуры.

Ответ 3

Какова мотивация вопроса? Это потому, что хранимая процедура содержит определенную логику, на которую вы полагаетесь, выполняясь всякий раз, когда вставляются данные? Если это так, вы можете использовать триггер для инкапсуляции этой логики.

Если это не подходит, и вы хотите, чтобы даже люди с полномочиями sysadmin не могли напрямую вставлять их в таблицу, вы не можете, но вы можете убедиться, что это не случайно, используя INSTEAD OF INSERT триггер, который вызывает ошибку и откатывается назад, если не установлено определенное значение CONTEXT_INFO, затем очищает CONTEXT_INFO (Ваша хранимая процедура может установить это на ожидаемое значение)

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

Ответ 4

Использовать разрешения (гранты). Создайте SP и предоставите право execute пользователю или роли, о которой идет речь. Затем отрицайте insert прямо на столе и все должно быть установлено.