Разрешения таблицы, когда пользователь с низким уровнем прав выполняет sproc

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

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

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

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

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

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

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

Поэтому у меня нет разрешений? Нужно ли как-то поднимать sproc? Или пользователь? Или как-то изменить схему?

я в тупике...


person Vaccano    schedule 23.02.2012    source источник


Ответы (3)


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

person Vaccano    schedule 23.02.2012

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

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

person Remus Rusanu    schedule 24.02.2012

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

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

person Diego    schedule 23.02.2012