"Разешение на выполнение данного действия..."

Кифирчик
Дата: 21.01.2009 00:29:14
Есть процедура
CREATE PROCEDURE [admin_ch].[proc_user_update]
 @user_id       INT=-1,
 ...
AS
BEGIN
  ...
  SELECT @user_id AS [user_id],@result_text AS [result], @error AS [error];
END
которая по мимо определённых манипуляций, возвращает некоторые данные... её создатель dbo
есть пользователь, которому даны права на вызов этой процедуры
GRANT EXECUTE
ON [admin_ch].[proc_user_update]
TO [tuser]
GO

есть код в делфи, который вызывает эту процедуру
  // загружаем данные пользователя
  sp := TADOStoredProc.Create(nil);
  try
      sp.Connection := Self.conn;
      sp.ProcedureName := 'admin_ch.proc_user_update';
      sp.Parameters.CreateParameter( 'user_id'      ,ftInteger,pdInput, 10,user_id         );
      ...
      //sp.ExecProc;
      sp.Open;
      if sp.FieldByName('error').AsInteger = 1 then
         ShowMessage(sp.FieldByName('result').AsString);
      sp.Close;
  finally
    sp.Free();
  end;
end;
если я вызываю процедуру через sp.ExecProc; то она нормально срабатывает, без всяких вопросов, но в этом случае, ничего нет в sp.FieldByName('error'), то есть, как я понял, не возвращается результат...
решил попробовать через sp.Open; - sp.Close; стала вылазить ошибка (на операторе sp.Open) - "У пользователя нет разрешений на выполнение данного действия"
аналгично при использовании ADODataSet.CommandText = 'EXEC admin_ch.proc_user_update :user_id...'
в данном примере можно конечно решить проблему через out параметры, но надо писать ещё и другие процедуры, которые возвращают наборы данных (таблички)... хочется разобраться в чём трабла..

вопрос: какое разрешение должно быть у пользователя на процедуру чтобы получить результат? или что я делаю не правильно при вызове процедуры из приложения?
tpg
Дата: 21.01.2009 06:51:17
Кифирчик
Дата: 21.01.2009 21:06:24
к сожалению трабла не в этом...
методом исключения, выяснил, проблемма в том, что внутри процедуры, есть вызов другой процедуры, которая выполняет команды sp_addrolemember/sp_droprolemember...
и для их вызова, пользователь должен быть членом роли db_securityadmin...
а этого чё-то ой как не хочется...

как сделать чтобы пользователь имел права только на запуск процедуры, а процедура запускалась от имени другого пользователя имеющего более широкие права? в частности на выполнение sp_addrolemember/sp_droprolemember ?
tpg
Дата: 22.01.2009 06:31:05
Кифирчик
к сожалению трабла не в этом...
методом исключения, выяснил, проблемма в том, что внутри процедуры, есть вызов другой процедуры, которая выполняет команды sp_addrolemember/sp_droprolemember...
и для их вызова, пользователь должен быть членом роли db_securityadmin...
а этого чё-то ой как не хочется...

как сделать чтобы пользователь имел права только на запуск процедуры, а процедура запускалась от имени другого пользователя имеющего более широкие права? в частности на выполнение sp_addrolemember/sp_droprolemember ?
Открыть в базе мастер эти процедуры, изучить и написать аналогичный код.