Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Изменение контекста выполнения запроса в SQL Server 2008 R2  [new]
belyaevpv79
Member

Откуда:
Сообщений: 22
Сразу оговорюсь, что вопрос задаю из дома, а база на работе, поэтому оперативно примеры давать не смогу. Теперь вопрос к уважаемым знатокам.

Сервер 2008 R2 (SP1).
Имеется некая база "БАЗА_1". В ней таблица "таблица_1". На сервере есть логин "юзер_1", для которого создан пользователь в "БАЗА_1" и этому пользователю дано разрешение на выборку данных из "таблица_1".

Имеется база "БАЗА_2", в которой есть хранимая процедура "процедура_1". В этой процедуре простейший код:

EXECUTE AS LOGIN = 'юзер_1'

SELECT * FROM [БАЗА_1].[dbo].[таблица_1]

REVERT


Соответственно есть логин "юзер_2" (в реальности их много), который подключен к "БАЗА_2", и которому дано разрешение на выполнение хранимки "процедура_1".
Для логина "юзер_2" дано разрешение GRANT IMPERSONATE ON LOGIN...

Все прекрасно работало... но... Мне понадобилось откорректировать хранимку "процедура_1", после чего при попытке ее выполнения из клиентской программы (Delphi 7, доступ через SQL OLE DB Provider) появляется сообщение об ошибке: "Серверу-участнику "юзер_2" не удалось обратиться к базе данных "БАЗА_1" в текущем контексте безопасности".
Хранимка при работе клиентской программы вызывается первой.

В ходе экспериментов выяснил, что хранимка начинает работать, если
1. юзер_2 допустить к "БАЗА_1" (не хотелось бы).
2. Если сделать подключение не через SQL OLE DB Provider, а через Native Client.
3. Если перед вызовом хранимки сделать запрос в котором есть
EXECUTE AS LOGIN = 'юзер_1'
.
После выполнения любого из этих действий начинает нормально работать вызов процедуры через SQL OLE DB Provider. Т.е.
1. отключаю "юзер_2" от "БАЗА_1".
2. Разово работаю через Native Client, потом все работает через SQL OLE DB Provider.
3. Все начинает работать.
НО... как только снова меняю процедуру (ALTER PROCEDURE) танцы с бубном начинаются вновь.

Куда копать, не знаю. Сломал голову... себе. Понять ничего не могу. Хотелось бы остаться на SQL OLE DB Provider-е.

ЗЫ: У процедуры ставил и EXECUTE AS SENDER, и EXECUTE AS OWNER, и WITH RECOMPILE. Ничего из этого не помогло.
8 сен 14, 17:51    [16551246]     Ответить | Цитировать Сообщить модератору
 Re: Изменение контекста выполнения запроса в SQL Server 2008 R2  [new]
wickedru
Member

Откуда: СПб
Сообщений: 52
http://msdn.microsoft.com/ru-ru/library/ee342155.aspx
10 ноя 14, 09:27    [16820652]     Ответить | Цитировать Сообщить модератору
 Re: Изменение контекста выполнения запроса в SQL Server 2008 R2  [new]
o-o
Guest
как у вас все описано, так ошибка должна выдаваться наоборот, логину юзер_1 из базы 2.
"Серверу-участнику..." -- это конечно шедевр "русификации насквозь", ошибка должна быть:
The server principal "юзер_1" is not able to access the database "БАЗА_2" under the current security context.
т.к. вы в базе 2 находитесь, и процедура в ней, и если логин "юзер_1" не отмаплен в базу 2, то все честно.
еще до выполнения EXECUTE AS LOGIN = 'юзер_1' логин 'юзер_1' должен попасть в базу 2, а он и не может.

но в общем и целом бред все равно.
какой смысл ухищряться кого-то не пускать в базу,
и при этом выдавать ему IMPERSONATE на логин, отмапленный в ту самую базу и имеющий там права?
отперсонэйтился в login "юзер_1" и иди себе читай в базе_1 без всякой процедуры
10 ноя 14, 22:41    [16825297]     Ответить | Цитировать Сообщить модератору
 Re: Изменение контекста выполнения запроса в SQL Server 2008 R2  [new]
belyaevpv79
Member

Откуда:
Сообщений: 22
Извиняюсь за свое отсутствие, по причине которого так поздно отвечаю.
Решил проблему другим способом.
НО!!!
Такое поведение оказалось обусловленным наличием в таблице поля типа TIMESTAMP.
Если сделать на таблицу представление, в которое это поле не включать, то все работает. Если удалить из таблицы поле типа TIMESTAMP, тоже все работает.
Сам в шоке.
28 апр 15, 18:52    [17577511]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить