Сохраненная процедура обращается к нескольким базам данных на одном сервере.

Я пытаюсь запустить хранимую процедуру из имени входа с ограниченными правами, которому были предоставлены разрешения на выполнение для указанной хранимой процедуры. Хранимая процедура обращается к 2 базам данных, которые существуют на одном сервере. Когда я выполняю хранимую процедуру, я получаю сообщение об ошибке:

Субъект сервера «LimitedUser» не может получить доступ к базе данных «Database2» в текущем контексте безопасности.

Немного предыстории: недавно мне поручили перенести наши 2 разных сервера баз данных в единую базу данных. Я сделал резервную копию и экспортировал необходимые базы данных и восстановил их на новом сервере. Более старыми базами данных являются MS sql server 2000 (для базы данных 2) и MS sql server 2005 (для базы данных 1, где находится вышеупомянутый хранимый процесс)

Я нашел некоторые выводы, которые, кажется, предполагают, что, поскольку я импортировал базы данных, владельцы были другими, и это могло вызвать проблему. Поэтому я запустил «exec sp_changedbowner 'sa'» для двух баз данных, чтобы убедиться, что у них один и тот же владелец. Я все еще получаю ту же ошибку при запуске хранимой процедуры из LimitedUser. Многие другие примеры на различных сайтах форумов имеют дело с базами данных, которые находятся на разных серверах... и должны использовать команды открытых запросов. Я не считаю, что это необходимо.

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

Спасибо!


person DontStealMyFish    schedule 31.10.2013    source источник


Ответы (1)


LimitedUser нужны разрешения на Database2, чтобы делать все, что хранимая процедура делает в этой базе данных, цепочка владения будет работать только в той же базе данных (если вы не включите опцию сервера Cross Database Ownership Chaining, которую я не рекомендую, поскольку она разрушает базу данных). контейнер в качестве границы безопасности).

Итак, например, у вас есть db1 и db2, в db1 есть сохраненный процесс, который выполняет select * from db2.dbo.table1

Для этого вам нужно, чтобы LimitedUser имел:

  • разрешения на выполнение в базе данных db1 для процедуры
  • выберите разрешения для таблицы1 в db2
person steoleary    schedule 01.11.2013
comment
Добавление используемого выполнения хранимой процедуры во вторую базу данных, а также добавление отдельных разрешений, которые хранимая процедура использует во второй базе данных, работает. Однако похоже, что исходные серверы баз данных не использовали этот метод. Я также посмотрел, что цепочка владения кросс-баз данных отключена на уровнях сервера и базы данных. Поэтому я не уверен, как хранимый процесс смог получить доступ к 2 базам данных, когда у исполняющего пользователя были только разрешения на выполнение для базы данных, на которой был сохранен хранимый процесс. Я пытаюсь включить этот новый сервер БД, чтобы он работал как старый. - person DontStealMyFish; 01.11.2013