Проблемы с запуском хранимой процедуры, принадлежащей другому пользователю - PullRequest
0 голосов
/ 14 июля 2009

У нас есть стороннее приложение, которое хочет вызвать хранимый процесс с использованием синтаксиса "схема" в стиле SQL 2005:

Customer.InsertNewOrder

Эта база данных все еще работает на SQL 2000, поэтому мы пытаемся сделать так, чтобы она «выглядела» как схема SQL 2005, и все еще работала правильно (с минимально необходимыми разрешениями). Итак, мы:

  1. Создан пользователь с именем «Клиент»
  2. Создан сохраненный процесс, принадлежащий этому пользователю
  3. Предоставил веб-пользователю права на выполнение хранимого процесса (через роль)

Предоставление нашим веб-пользователям прав на выполнение - это обычно все, что требуется для запуска принадлежащих dbo процедур (например, "dbo.InsertOrder"). Обычно нам не нужно предоставлять явные разрешения для базовых таблиц. Но это не похоже на работу в этом случае. Мы получаем ошибку:

INSERT permission denied on object "Order"

Так что я делаю не так?

Как я могу сказать , что пользователю отказано здесь. Это мой веб-пользователь? Или это «выполняется как» пользователь Customer , а пользователю Customer требуются дополнительные разрешения? (Я пытался предоставить дополнительное разрешение пользователю Customer (db_datareader и db_datawriter, даже пробовал db_owner), но, похоже, это не помогло. Во всяком случае, db_owner не работает в рабочей среде.)

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

EDIT:
Я упростил ради этого вопроса. На самом деле, у меня есть несколько десятков сохраненных процедур под двумя разными «схемами», которые вставляют, обновляют и выбирают из множества таблиц. Так что надеюсь, что не придется вручную детализировать разрешения для всех, если я могу помочь ...

Ответы [ 2 ]

2 голосов
/ 14 июля 2009

"Когда один пользователь владеет исходным объектом и все целевые объекты, собственность Цепочка называется неразрывной. Если разные пользователи владеют целью объекты, цепочка собственности сломана. SQL Server опирается на состояние цепочки собственности, чтобы определить когда проверять разрешения.
(отрывок)
Если цепочка владения разорвана, SQL Сервер проверяет разрешения на каждом филиал сети принадлежит другой пользователь. Только те заявления где пользователь имеет необходимое разрешения будут выполнены, а остальные заявления получат Ошибка «Недостаточно прав». Таким образом, SQL Server позволяет владельцам объектов сохранять контроль над разрешениями. "

Цитируется из Использование цепочек владения

Чтобы применить это к текущему сценарию, когда процесс Customer.InsertOrder пытается вставить в таблицу dbo.Order , это разрывает цепочку владения, и SQL проверяет, чтобы увидеть если оригинальный пользователь (в данном случае WebUser) имеет разрешение на выполнение вставки.

Так что WebUser (не Customer) потребуется разрешение для ВСТАВКИ в dbo.Order (либо явно, либо через db_datawriter). При желании все разрешения могут быть удалены у Клиента.

0 голосов
/ 14 июля 2009

Это пользователь Заказчика. Для доступа к таблице данных требуется доступ для записи данных.

...