Разрешения таблицы, когда пользователь с низким разрешением выполняет sproc - PullRequest
1 голос
/ 24 февраля 2012

У меня есть sproc (назовите его client.UpdateClient), который выполняется пользователем SQL (назовите его MyWCFServicesUser.

MyWCFServicesUser, имеет права доступа к базе данных и устройству записи данных. Он также имеет команду executeразрешения для sproc (но без других разрешений).

Sproc вставит строку в client.Client с SET IDENITY_INSERT client.Client ON.

Когда я запускаю этот sproc (из SSMS) с интегрированной безопасностью(Я sa), все работает нормально.

Когда я запускаю его как MyWCFServicesUser (из SSMS), происходит сбой с этой ошибкой:

Msg 1088, уровень 16, Состояние 11, Процедура UpdateClient, Строка 33
Не удается найти объект "client.Client", так как он не существует или у вас нет разрешений.

У меня обычно есть все мои sprocs и таблицыв схеме по умолчанию (dbo), но на этот раз я пытаюсь не использовать dbo.

Это то, почему у меня нет разрешений? Мне нужно каким-либо образом повысить sproc? Или пользователь? Или как-топоменять схему?

я в тупике ...

Ответы [ 3 ]

3 голосов
/ 24 февраля 2012

Оказывается, что SET IDENTITY_INSERT требует изменения прав пользователя.

2 голосов
/ 24 февраля 2012

Правильный способ разрешения требований привилегий в процессах магазина - использовать подпись кода . Таким образом, вы предоставляете требуемую привилегию (т.е. ALTER TABLE) для процедуры , а не для пользователя, и вам нужно только предоставить EXECUTE для процедуры (или схемы) пользователю. Преимущество состоит в том, что ваш пользователь с низкими привилегиями может только вызывать процедуру и выполнять любое действие, требующее повышенных привилегий (т. Е. Установка identity_insert на), контролируемое процедурой. Если бы вы предоставили требуемую привилегию непосредственно пользователю, он / она мог бы использовать ее для любой операции , разрешенной указанной привилегией (например, добавить столбцы, ограничения удаления и т. Д. И т. Д.). Ссылка имеет несколько примеров.

При этом я должен сказать, что ваш вопрос касается SET IDENTITY_INSERT, который является специальной настройкой, обычно используемой для одноразовой загрузки данных. Тот факт, что вы устанавливаете это из того, что кажется обычной процедурой CRUD UpdateClient, немного пахнет кодом.

0 голосов
/ 24 февраля 2012

важно то, кто является владельцем упомянутых вами объектов. Есть ли шанс, что они были созданы разными пользователями? Может быть, sa является владельцем таблицы, а MyWCFServicesUser владеет процедурой?

См. Эту ссылку о цепочках владения http://msdn.microsoft.com/en-us/library/ms188676.aspx, это может помочь вам в вашем расследовании

...