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

Откуда:
Сообщений: 39
Привет!
Подскажите мне как решить такую проблему?
Есть ХП доступ к которой имеют пользователи, зарегистрированные с правами ГОСТЯ. ХП должна вернуть результат в курсор. Если подключаешься к серверу с правами SA, то ХП успешно выполняется и возвращает данные в курсор. Если подключаешься как ГОСТЬ, то никакого результата не возвращается. В конце ХП прописана строка:
exec(@sql)
Может быть, в связи с этим надо права ГОСТЯ расширить? ГОСТЬ имеет право только доступ к ХП.
15 июн 04, 16:37    [743134]     Ответить | Цитировать Сообщить модератору
 Re: Возврат результата в курсор  [new]
paparome
Member

Откуда: Москва
Сообщений: 4312
https://www.sql.ru/faq/faq_topic.aspx?fid=104

Там про особенности динамического запроса умные люби все написали - мне лучше не сказать :)
15 июн 04, 16:40    [743145]     Ответить | Цитировать Сообщить модератору
 Re: Возврат результата в курсор  [new]
soltik
Member

Откуда:
Сообщений: 39
Попробовал я так сделать так, теперь и с правами SA не возвращает результат.
15 июн 04, 17:02    [743226]     Ответить | Цитировать Сообщить модератору
 Re: Возврат результата в курсор  [new]
Белов Владимир
Member

Откуда: Москва
Сообщений: 1716
ну так давайте, опубликуйте часть кода.
15 июн 04, 17:09    [743256]     Ответить | Цитировать Сообщить модератору
 Re: Возврат результата в курсор  [new]
soltik
Member

Откуда:
Сообщений: 39
Есть вот такая ХП
CREATE PROCEDURE dbo.proc_new
@param1 int,
@param2 int,
@param3 nvarchar(15)
AS
declare
@table nvarchar(15),
@sql nvarchar(1000)
SET @param1=@param1
SET @param2=@param2
SET @table='tab_'+@param3
SELECT @sql='SELECT * FROM '+ @table+' WHERE (kod1 = ' +
CAST(@param1 AS varchar(10)) + ') AND (kod2 =' + CAST(@param2 AS varchar(10)) + ')'
exec(@sql)
GO
Если SA, то на клиенте возвращается курсор, все как надо.
Пытаюсь войти как ГОСТЬ, курсор не возвращается.
Эксперементировал по другому не получается.
15 июн 04, 17:15    [743295]     Ответить | Цитировать Сообщить модератору
 Re: Возврат результата в курсор  [new]
soltik
Member

Откуда:
Сообщений: 39
Мне не понятно, почему он не возвращает результат в курсор?
15 июн 04, 17:51    [743406]     Ответить | Цитировать Сообщить модератору
 Re: Возврат результата в курсор  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
мож прав на селект из таблицы у юзверя нет
15 июн 04, 17:53    [743411]     Ответить | Цитировать Сообщить модератору
 Re: Возврат результата в курсор  [new]
paparome
Member

Откуда: Москва
Сообщений: 4312
FAQ
I.Особенности динамического запроса
1. Динамический запрос ВСЕГДА выполняется В ТОМ-ЖЕ КОННЕКТЕ и КАК ОТДЕЛЬНЫЙ ПАКЕТ(batch). Другими словами при использовании такого запроса,
- вы ни имеете доступа к локальным переменным, объявленым до вызова динамического запроса (однако возможен доступ к объявленным ранее временным таблицам)
- все временые таблицы и переменные, созданные во время выполнения команды exec, будут недоступны в вызывающей процедуре, т.к. будут удалены вместе с коненктом, открытым для exec.

2. Динамический запрос ВСЕГДА выполняется с ПРАВАМИ ПОЛЬЗОВАТЕЛЯ, ВЫЗВАВШЕГО ПРОЦЕДУРУ, а не с правами владельца процедуры. Другими словами, если владельцем процедуры Procedure1 является User1, который имеет права к таблице Table1, то для пользователя User2 мало назначить права на выполнение процедуры Procedure1, если обращение в ней к таблице Table1 идет через динамический запрос. Придется давать ему соответствующие права и непосредственно для Table1.

3. Компиляция запроса происходят непосредственно перед его вызовом. Т.е. обо все синтаксических ошибках вы узнаете только в этот момент.


Это то место, на которое я пытался обратить ваше внимение в посте от 16:40
15 июн 04, 17:55    [743419]     Ответить | Цитировать Сообщить модератору
 Re: Возврат результата в курсор  [new]
soltik
Member

Откуда:
Сообщений: 39
Была вот такая ХП
CREATE PROCEDURE dbo.proc
@param1 int,
@param2 int
AS
SELECT *
FROM tabl
WHERE (kod1 = @param1) AND (kod = @param2)
GO
Результат выполнения передавался клиенту и там далее я обрабатывал курсор вне зависимости от того под какими правами я входил. У гостя было только право на использование этой ХП. Ни SELECT ни чего другого не было. Все работало нормально. Затем мне пришлось от поставленной задачи усложнить код ХП и в результате получилось, то что ГОСТЬ не может получить этот курсор, но SA может. В чем причина понятия не имею.
15 июн 04, 18:00    [743433]     Ответить | Цитировать Сообщить модератору
 Re: Возврат результата в курсор  [new]
paparome
Member

Откуда: Москва
Сообщений: 4312
И еще раз
автор

Динамический запрос ВСЕГДА выполняется с ПРАВАМИ ПОЛЬЗОВАТЕЛЯ, ВЫЗВАВШЕГО ПРОЦЕДУРУ


?
15 июн 04, 18:02    [743442]     Ответить | Цитировать Сообщить модератору
 Re: Возврат результата в курсор  [new]
neal
Member

Откуда: Сердце Москвы
Сообщений: 492
Либо может явно указывать dbo. перед именами таблиц

CREATE PROCEDURE dbo.proc_new
@param1 int,
@param2 int,
@param3 nvarchar(15)
AS
declare
@table nvarchar(15),
@sql nvarchar(1000)
SET @param1=@param1
SET @param2=@param2
SET @table='tab_'+@param3
SET @sql='SELECT * FROM dbo.'+ @table+' WHERE (kod1 = ' +
CAST(@param1 AS varchar(10)) + ') AND (kod2 =' + CAST(@param2 AS varchar(10)) + ')'
exec(@sql)
GO
15 июн 04, 18:08    [743459]     Ответить | Цитировать Сообщить модератору
 Re: Возврат результата в курсор  [new]
soltik
Member

Откуда:
Сообщений: 39
Да..., теперь я назначил права пользователя SELECT на эту таблицу и все заработало.
Спасибо всем!
15 июн 04, 18:09    [743462]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить