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

Откуда:
Сообщений: 46
На сервере SQL тип авторизации установлен только для пользователей домена. Полных прав на управление сервером нет. Можно ли запустить процедуру от имени другого пользователя (члена домена), не зная его пароля? Предполагаю, что нет. Поэтому сразу следующий вопрос - как обойти это ограничение?
Необходимо произвести отладку процедуры и исключить использование роли db_owner в коде.

Предыстория:
Имеется некоторый код, который выполняет select из разных таблиц, создает временную таблицу (CREATE TABLE #Report04), делает из нее итоговую выборку, а потом вносит записи в таблицу-лог. Все прекрасно работает, но... Неожиданно поступило распоряжение убрать роль db_owner у всех пользователей. После этого у пользователей программа перестает работать.
4 дек 12, 14:38    [13575517]     Ответить | Цитировать Сообщить модератору
 Re: Использование роли db_owner в процедуре  [new]
Glory
Member

Откуда:
Сообщений: 104751
pol_ar
Необходимо произвести отладку процедуры и исключить использование роли db_owner в коде.

Нужно дать права на запуск процедуры в контексте другого пользоваетеля
Читать про EXECUTE AS

pol_ar
После этого у пользователей программа перестает работать.

Прочитать сообщение об ошибке никто не догодался ?
4 дек 12, 15:15    [13575878]     Ответить | Цитировать Сообщить модератору
 Re: Использование роли db_owner в процедуре  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2423
pol_ar,

а вы когда оунера убрали взамен что нибудь оставили?
4 дек 12, 15:18    [13575901]     Ответить | Цитировать Сообщить модератору
 Re: Использование роли db_owner в процедуре  [new]
pol_ar
Member

Откуда:
Сообщений: 46
Glory
Нужно дать права на запуск процедуры в контексте другого пользоваетеля
Читать про EXECUTE AS

Да, спасибо. Вот как раз EXECUTE AS не получается, кажется не хватает прав на переключение контекста... Но я пробую, и если выйдет что, то сразу отпишу.

Glory
Прочитать сообщение об ошибке никто не догодался ?

Если это облегчит понимание, то пожалуйста...
"Не удается найти объект в семействе, соответствующий требуемому имени или порядковому номеру".
"Отсутствует текст для объекта <имя выполняемой процедуры>"
4 дек 12, 15:32    [13576040]     Ответить | Цитировать Сообщить модератору
 Re: Использование роли db_owner в процедуре  [new]
pol_ar
Member

Откуда:
Сообщений: 46
WarAnt
pol_ar,
а вы когда оунера убрали взамен что нибудь оставили?

Да, конечно. Осталось разрешение EXECUTE на процедуру. Только процедура хитрая, она делает много всяких действий. Задача состоит в том, чтобы определить, в каком месте ей требуются права db_owner. Для создания временной таблицы вроде не требуются. Или требуются? Есть еще действия, связанные с изменением параметров сервера, например:
BEGIN TRY
exec sp_configure 'show advanced options', 1;
RECONFIGURE;
END TRY
BEGIN CATCH
--print 'Failed setup: show advanced options'
END CATCH
Указанные строки подгружаются в переменную и затем выполнятются через:
exec (@_q7)
Но там, видите, стоит TRY. Предполагается, что команды должны игнорироваться при ошибке. Когда есть права db_owner, так и происходит (т.к. прав на действие sp_configure нет). Если проуедуру запускает админ с полными правами, то выполняется некий "setup" - сначала sp_configure, потом ряд других действий. Может быть здесь заковыка? Только без большого опыта разработки я этого знать не могу. Поэтому обратился на форум. Какие будут идеи?
4 дек 12, 15:46    [13576201]     Ответить | Цитировать Сообщить модератору
 Re: Использование роли db_owner в процедуре  [new]
Glory
Member

Откуда:
Сообщений: 104751
pol_ar
Если это облегчит понимание, то пожалуйста...
"Не удается найти объект в семействе, соответствующий требуемому имени или порядковому номеру".
"Отсутствует текст для объекта <имя выполняемой процедуры>"

Это не ошибка сервера. Это ошибка вашего приложения.
4 дек 12, 15:48    [13576236]     Ответить | Цитировать Сообщить модератору
 Re: Использование роли db_owner в процедуре  [new]
Glory
Member

Откуда:
Сообщений: 104751
pol_ar
Задача состоит в том, чтобы определить, в каком месте ей требуются права db_owner. Для создания временной таблицы вроде не требуются.

Вы уверены, что дело доходит до ЗАПУСКА процедуры ?
4 дек 12, 15:49    [13576238]     Ответить | Цитировать Сообщить модератору
 Re: Использование роли db_owner в процедуре  [new]
pol_ar
Member

Откуда:
Сообщений: 46
Glory
Нужно дать права на запуск процедуры в контексте другого пользоваетеля
Читать про EXECUTE AS

Вообщем, не получается ничего. Такая конструкция не проходит. Сообщение об ошибке в конце.

use DB1
EXECUTE AS USER = 'FIRM\coder'
GO
exec DB1.dbo.Report 'param1', 'param2', 'param3'
GO
REVERT
GO
--Серверу-участнику "FIRM\coder" не удалось обратиться к базе данных "DB-2" в текущем контексте безопасности.
4 дек 12, 15:58    [13576303]     Ответить | Цитировать Сообщить модератору
 Re: Использование роли db_owner в процедуре  [new]
Glory
Member

Откуда:
Сообщений: 104751
И не получится

- EXECUTE AS должно быть в CREATE PROCEDURE
- пользователю должно быть дано право на impersonate
4 дек 12, 16:02    [13576335]     Ответить | Цитировать Сообщить модератору
 Re: Использование роли db_owner в процедуре  [new]
pol_ar
Member

Откуда:
Сообщений: 46
Glory
Вы уверены, что дело доходит до ЗАПУСКА процедуры ?

Не уверен. Вот если бы можно было создать пользователя sql с ограниченными правами, и проверить... Но... нельзя, прав нет. ))
4 дек 12, 16:02    [13576338]     Ответить | Цитировать Сообщить модератору
 Re: Использование роли db_owner в процедуре  [new]
Glory
Member

Откуда:
Сообщений: 104751
pol_ar
Не уверен. Вот если бы можно было создать пользователя sql с ограниченными правами, и проверить...

Что мешает использовать текущего пользователя для запуска процедуры напрямую ?
И сравнить тексты ошибок ?
4 дек 12, 16:03    [13576348]     Ответить | Цитировать Сообщить модератору
 Re: Использование роли db_owner в процедуре  [new]
Cittanuvo
Member [заблокирован]

Откуда: Москва
Сообщений: 953
pol_ar
На сервере SQL тип авторизации установлен только для пользователей домена. Полных прав на управление сервером нет. Можно ли запустить процедуру от имени другого пользователя (члена домена), не зная его пароля? Предполагаю, что нет. Поэтому сразу следующий вопрос - как обойти это ограничение?
Необходимо произвести отладку процедуры и исключить использование роли db_owner в коде.

Предыстория:
Имеется некоторый код, который выполняет select из разных таблиц, создает временную таблицу (CREATE TABLE #Report04), делает из нее итоговую выборку, а потом вносит записи в таблицу-лог. Все прекрасно работает, но... Неожиданно поступило распоряжение убрать роль db_owner у всех пользователей. После этого у пользователей программа перестает работать.


может просто вызывать вашу процедуру с префиксом dbo?
4 дек 12, 16:05    [13576356]     Ответить | Цитировать Сообщить модератору
 Re: Использование роли db_owner в процедуре  [new]
Glory
Member

Откуда:
Сообщений: 104751
pol_ar
Серверу-участнику "FIRM\coder" не удалось обратиться к базе данных "DB-2" в текущем контексте безопасности.

use DB1

Там еще и межбазовые запросы.
4 дек 12, 16:08    [13576369]     Ответить | Цитировать Сообщить модератору
 Re: Использование роли db_owner в процедуре  [new]
pol_ar
Member

Откуда:
Сообщений: 46
Glory
И не получится
- EXECUTE AS должно быть в CREATE PROCEDURE
- пользователю должно быть дано право на impersonate

Никаких CREATE PROCEDURE не используется, процедура уже создана, положена на сервере, и работает. Есть только (CREATE TABLE #Report) внутри нее.
Право на impersonate есть у меня. У пользователей, естественно, нет.
4 дек 12, 16:08    [13576374]     Ответить | Цитировать Сообщить модератору
 Re: Использование роли db_owner в процедуре  [new]
pol_ar
Member

Откуда:
Сообщений: 46
Glory
pol_ar
Если это облегчит понимание, то пожалуйста...
"Не удается найти объект в семействе, соответствующий требуемому имени или порядковому номеру".
"Отсутствует текст для объекта <имя выполняемой процедуры>"

Это не ошибка сервера. Это ошибка вашего приложения.


Первая часть - это ошибка приложения - нет данных в recordset.
Вторая часть (Отсутствует текст для объекта) - ошибка сервера.
4 дек 12, 16:14    [13576416]     Ответить | Цитировать Сообщить модератору
 Re: Использование роли db_owner в процедуре  [new]
Glory
Member

Откуда:
Сообщений: 104751
pol_ar
Вторая часть (Отсутствует текст для объекта) - ошибка сервера.

Серверная ошибка
1. выглядит так
Msg 2812, Level 16, State 62, Line 1
Could not find stored procedure 'xxx'.

2. воспроизводится при коннекте из любого приложения
4 дек 12, 16:17    [13576435]     Ответить | Цитировать Сообщить модератору
 Re: Использование роли db_owner в процедуре  [new]
pol_ar
Member

Откуда:
Сообщений: 46
Cittanuvo
может просто вызывать вашу процедуру с префиксом dbo?

Контекст явно указывается при установке соединения с БД. Но на всякий случай я попробовал заменить вызов процедуры с
"exec Report" на "exec DB1.dbo.Report". Но это все равно не помогло.
4 дек 12, 16:20    [13576452]     Ответить | Цитировать Сообщить модератору
 Re: Использование роли db_owner в процедуре  [new]
SergePnb
Member

Откуда: Киев
Сообщений: 456
pol_ar
Вторая часть (Отсутствует текст для объекта) - ошибка сервера.


Единственное что может быть хоть как-то близко к вашему тексту это

Msg 15197, Level 16, State 1, Procedure sp_helptext, Line 107
There is no text for object 'XXXXXXXXX'.

Вы вызываете внутри sp_helptext ?
4 дек 12, 16:21    [13576465]     Ответить | Цитировать Сообщить модератору
 Re: Использование роли db_owner в процедуре  [new]
Cittanuvo
Member [заблокирован]

Откуда: Москва
Сообщений: 953
pol_ar
Cittanuvo
может просто вызывать вашу процедуру с префиксом dbo?

Контекст явно указывается при установке соединения с БД. Но на всякий случай я попробовал заменить вызов процедуры с
"exec Report" на "exec DB1.dbo.Report". Но это все равно не помогло.


а у пользователей есть права на выполнение процедуры?
4 дек 12, 16:26    [13576495]     Ответить | Цитировать Сообщить модератору
 Re: Использование роли db_owner в процедуре  [new]
pol_ar
Member

Откуда:
Сообщений: 46
Glory
Там еще и межбазовые запросы.

Да, есть такое. Три БД участвуют в этом комплексе. Причем при разработке не ставились какие-то ограничения. У меня две базы были на чтение, и одна с полным доступом для логов и параметров пользователя. А потом пришел новый начальник, "на готовенькое", и вдруг решил все запрещать. Все права обрезали, никого не спрашивая. Я думаю, это, конечно, правильно, насчет прав. Но бесит. Хорошо, что еще не запустили в эксплуатацию. Я бы тогда повесился здесь, на лампочке... )))
4 дек 12, 16:26    [13576497]     Ответить | Цитировать Сообщить модератору
 Re: Использование роли db_owner в процедуре  [new]
pol_ar
Member

Откуда:
Сообщений: 46
Glory
pol_ar
Вторая часть (Отсутствует текст для объекта) - ошибка сервера.

Серверная ошибка выглядит так
Msg 2812, Level 16, State 62, Line 1
Could not find stored procedure 'xxx'.

Да. Сервер SQL - русский. Текст ошибки передается в приложение. Что-то вроде:
"Отсутствует текст для объекта Report"
ErrorNumber 916, ErrorSeverity 14, ErrorState 1, ErrorProcedure NULL, ErrorLine 10
4 дек 12, 16:35    [13576561]     Ответить | Цитировать Сообщить модератору
 Re: Использование роли db_owner в процедуре  [new]
Glory
Member

Откуда:
Сообщений: 104751
pol_ar
ErrorNumber 916, ErrorSeverity 14, ErrorState 1, ErrorProcedure NULL, ErrorLine 10

Вообще-то 916 - это The server principal "%.*ls" is not able to access the database "%.*ls" under the current security context.
4 дек 12, 16:38    [13576586]     Ответить | Цитировать Сообщить модератору
 Re: Использование роли db_owner в процедуре  [new]
Кот Матроскин
Member

Откуда: Москва
Сообщений: 8933
Если у Вас данные собираются из разных баз - не хотите вместо EXECUTE AS USER делать EXECUTE AS LOGIN (у которго есть соответствующие права во всех нужных базах)?
4 дек 12, 16:39    [13576597]     Ответить | Цитировать Сообщить модератору
 Re: Использование роли db_owner в процедуре  [new]
pol_ar
Member

Откуда:
Сообщений: 46
SergePnb
Единственное что может быть хоть как-то близко к вашему тексту это...
Вы вызываете внутри sp_helptext ?

Да! Вызов sp_helptext используется для вычисления контрольной суммы выполняемого кода. Завтра проверю такую возможность, отключив этот блок. О результате отпишу. Это важное замечание. Благодарю!
4 дек 12, 16:42    [13576623]     Ответить | Цитировать Сообщить модератору
 Re: Использование роли db_owner в процедуре  [new]
SergePnb
Member

Откуда: Киев
Сообщений: 456
pol_ar
Сервер SQL - русский. Текст ошибки передается в приложение. Что-то вроде:
"Отсутствует текст для объекта Report"
ErrorNumber 916, ErrorSeverity 14, ErrorState 1, ErrorProcedure NULL, ErrorLine 10


У вас где-то текст ошибки подминился ((
Мне вот это говорит
select text
from master.sys.messages
where message_id = 916
  and language_id = 1049

Серверу-участнику "%1!" не удалось обратиться к базе данных "%2!" в текущем контексте безопасности.

Впрочем, вы эту ошибку тоже показывали. Думаю что тут и есть корень ваших проблем
4 дек 12, 16:43    [13576629]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить