Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.06.2011, 10:51   #1
Greek9000
Форумчанин
 
Регистрация: 01.09.2009
Сообщений: 151
По умолчанию Проблемы с EXECUTE AS

Здравствуйте.
Пытаюсь запустить одну хранимую процедуру с делегированными правами при помощи EXECUTE AS, но мне постоянно возвращается ошибка:
"Серверу-участнику "sa" не удалось обратиться к базе данных "Archive" в текущем контексте безопасности."

Дело в том, что я пытаюсь в этой процедуре (назовём её sp_Test) сделать селект из другой БД.
Для этого я создал логин и пользователя в первой (рабочей) БД и дал ему право на выполнение sp_Test.
Вот её текст:

Код:
ALTER PROCEDURE [dbo].[sp_Test]
AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;

    -- Insert statements for procedure here
	select * from OuterBase.dbo.Table_1;
END
Естесственно, выскакивает ошибка:
Серверу-участнику "test_user" не удалось обратиться к базе данных "OuterBase" в текущем контексте безопасности.

Теперь создаю логин db_master и пользователей в обе БД с такими же именами, и назначаю им роли db_owner. Если залогиниться под db_master, то sp_Test выполняется нормально - значит права есть.

Но если добавить в sp_Test строчку
execute as user = 'db_master', то выполнение этой процедуры из-под любого пользователя завершается ошибкой:
Серверу-участнику "db_master"(!прошу обратить внимание!) не удалось обратиться к базе данных "OuterBase" в текущем контексте безопасности.

Что я неправильно делаю?
Greek9000 вне форума Ответить с цитированием
Старый 14.06.2011, 11:03   #2
Sparkman
220400
Форумчанин
 
Аватар для Sparkman
 
Регистрация: 21.05.2010
Сообщений: 726
По умолчанию

дать права на вызов процедуры пользователю
GRANT EXECUTE ON [sp_Test] TO test_user

потом вызывать execute as user = 'test_user'

источник 1, 2
Cерьёзной помощи не ждите - помогаю в перерывах на "перекур".
Не существует ничего невозможного для человека, который не собирается ничего делать сам.
Не учите человека, если вы не его учитель.
Sparkman вне форума Ответить с цитированием
Старый 14.06.2011, 11:35   #3
Greek9000
Форумчанин
 
Регистрация: 01.09.2009
Сообщений: 151
По умолчанию

Цитата:
Сообщение от Sparkman Посмотреть сообщение
дать права на вызов процедуры пользователю
GRANT EXECUTE ON [sp_Test] TO test_user

потом вызывать execute as user = 'test_user'
У test_user есть права на sp_Test. Если в ней не использовать обращения к объектам (в моём случае - таблицам) других БД, то всё работает замечательно. Но как только я добавляю обращение к объекту той БД, на которую нету прав у test_user - начинаются ошибки.

Но суть проблемы заключается в том, что я хочу настроить для test_user права доступа на одну (рабочую) бд в которой дам ему права на исполнение хранимых процедур, а уж эти процедуры бы обращались к любым таблицам любых баз данных используя права владельцев этих БД. Такое, вообще, возможно?
Greek9000 вне форума Ответить с цитированием
Старый 21.09.2018, 19:59   #4
Lysyi
 
Регистрация: 21.09.2018
Сообщений: 3
По умолчанию

Greek9000, приветствую.

Понимаю, что дела давно минувших дней, но может ты нашёл решение в конце концов?
Бьюсь уже бог знает сколько времени - всё перепробовал, не выходит ничего.

У меня точно такая же ситуация, только но ХП, а тригер и он не читает из соседней БД, а пишет в неё.

Вот вроде есть дока MS-овская про эту ошибку: https://docs.microsoft.com/ru-ru/sql...ql-server-2017
Но бесполезно всё...
Lysyi вне форума Ответить с цитированием
Старый 21.09.2018, 21:06   #5
Greek9000
Форумчанин
 
Регистрация: 01.09.2009
Сообщений: 151
По умолчанию

Цитата:
Сообщение от Lysyi Посмотреть сообщение
Greek9000, приветствую.

Понимаю, что дела давно минувших дней, но может ты нашёл решение в конце концов?
Бьюсь уже бог знает сколько времени - всё перепробовал, не выходит ничего.

У меня точно такая же ситуация, только но ХП, а тригер и он не читает из соседней БД, а пишет в неё.

Вот вроде есть дока MS-овская про эту ошибку: https://docs.microsoft.com/ru-ru/sql...ql-server-2017
Но бесполезно всё...
Как-то я тогда выкрутился, но не средствами SQL.

У меня была задача перенести данные из одной БД в другую, при условии, что структура таблиц в целевой БД достаточно сильно отличалась от исходной
Кажется, пришлось написать для этого сервис который подключался к обеим базам и переносил данные из одной в другую по следующей схеме: в оригинальной БД подготавливается представление со структурой соответствующей таблице целевой БД, а сервис - это простая программа выполняющая селект из этой вьюхи и как есть вставляющая результат в целевую таблицу

Но если задача такая, что надо обязательно подключиться из-под СУБД, то вместо EXECUTE AS стоит попробовать межсерверное подключение - sp_addlinkedserver. Эта функция создает подключение к заданной БД на удаленном сервере. Естественно, сервер может быть не удаленным, а текущим.
Greek9000 вне форума Ответить с цитированием
Старый 24.09.2018, 18:25   #6
Lysyi
 
Регистрация: 21.09.2018
Сообщений: 3
По умолчанию

Спасибо.
Обидно, что не работает самый прямой и простой вариант, обходные манёвры приходится применять.
И главное - по документации судя, всё должно работать, ан нет...

У меня вообще ситуация такая, что 2 БД на одном сервере постоянно синхронизируют между собой кое-какие данные через триггера. И пока вся работа идёт под логином с серверной ролью sysadmin (и без применения EXECUTE AS) всё работает. Но вот встала задача ограничить права для безопасности и столкнулся с тем, что MS SQL работает не так, как описано в документации.
А это вообще-то довольно странно (что MS SQL работает не по документации), и я вот думаю: может опция какая-то есть хитрая, которая за это отвечает...
Lysyi вне форума Ответить с цитированием
Старый 24.09.2018, 20:18   #7
Lysyi
 
Регистрация: 21.09.2018
Сообщений: 3
По умолчанию

А, всё - разобрался...
Действительно Свойство базы данных TRUSTWORTHY: ставишь ON в обоих БД и всё работает как написано.
Lysyi вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
не выполняется opendialog1.Execute virtuhay266 Общие вопросы Delphi 2 09.01.2011 00:06
не выполняется opendialog1.Execute virtuhay266 Помощь студентам 9 08.01.2011 22:12
Инструкция Execute Desha Microsoft Office Access 6 10.06.2010 20:11
Ошибка при OpenDialog.Execute ymka2 Общие вопросы Delphi 10 27.11.2009 14:15
Проблема с фкнкцией Execute rocky7 Общие вопросы C/C++ 0 01.03.2009 16:42