ORA-01031: недостаточные привилегии при выполнении индекса перестройки из хранимой процедуры [дубликат]

Существует функция iOS, называемая BackgroundFetch, которую вы можете настроить для

, регулярно загружает и обрабатывает небольшие объемы контента из сети

blockquote>

Вы можете настроить minimumBackgroundFetchInterval.

В отличие от упомянутой функции Android этот интервал не гарантируется.

ОС выполняет некоторую эвристику в черном ящике. Он вознаграждает вас за использование «разумного» (для ОС) времени процессора / энергопотребления, а также для частого использования пользователем. С другой стороны, вы получаете наказание за дренирование батареи, что еще хуже, если ваше приложение никогда не использовалось.

Смотрите: Документация по Apple


В качестве альтернативы, в зависимости от ваших потребностей, вы можете публиковать Silent (push) Notification всякий раз, когда данные пользователя изменяются на стороне сервера ,

Смотрите: Документация по Apple

33
задан 2 revs 16 June 2009 в 14:51
поделиться

4 ответа

Модель безопасности Oracle такова, что при выполнении динамического SQL с использованием Execute Immediate (внутри контекста блока или процедуры PL / SQL) пользователь не имеет прав на объекты или команды, которые предоставляются через членство в ролях. У вашего пользователя, вероятно, есть роль «DBA» или что-то подобное. Вы должны явно предоставить разрешения «drop table» для этого пользователя. То же самое было бы применимо, если бы вы пытались выбрать из таблиц в другой схеме (например, sys или system) - вам нужно предоставить явным привилегии SELECT для этой таблицы этому пользователю.

17
ответ дан Steve Broberg 21 August 2018 в 15:10
поделиться
  • 1
    Спасибо за ответ. Я попробовал EXECUTE IMMEDIATE('GRANT drop table ON ' || schema_name || '.' || tblToDrop || ' TO ben');, но я получаю недопустимую ошибку привилегий для этой строки. Я посмотрел онлайн, чтобы назначить привилегию для удаления таблицы, но я не могу найти ничего. Я попробовал все и «drop table & quot; но я получаю ту же ошибку. Вы знаете, где я могу найти правильное имя или что я здесь делаю неправильно? Еще раз, спасибо. – tundal45 15 June 2009 в 17:15
  • 2
    Не используйте EXECUTE IMMEDIATE для предоставления привилегии. Вы должны предоставить привилегию при переходе в BEN: ТАБЛИЦА ГРАНТА DROP BEN – Steve Broberg 15 June 2009 в 19:31
  • 3
    Стив, я просто понял это. Оказывается, я могу определить привилегии в процедуре, используя AUTHID. Если мне нужны те же привилегии, что и создатель, я использую AUTHID DEFINER. Если мне нужны привилегии текущего пользователя, я использую AUTHID CURRENT_USER. Вот как выглядит оболочка процедуры: СОЗДАТЬ ИЛИ ЗАМЕНИТЬ ПРОЦЕДУРУ some_procedure AUTHID CURRENT_USER НАЧИНАЕТСЯ DECLARE BEGIN END; КОНЕЦ; – tundal45 16 June 2009 в 14:45

В качестве альтернативы вы можете предоставить привилегию пользователя DROP_ANY_TABLE, если это необходимо, и процедура будет выполняться, так как это не требует каких-либо изменений. Опасно, может быть, но зависит от того, что вы делаете:)

0
ответ дан 3 revs, 2 users 75% 21 August 2018 в 15:10
поделиться
  • 1
    За исключением того, что это приводит к недействительности причины наличия привилегий в первую очередь. Кроме того, "DROP_ANY_TABLE" вряд ли будет случайно предоставлена ​​на производство для любой крупномасштабной корпорации. – David Keener 10 March 2015 в 20:04

вы можете использовать «AUTHID CURRENT_USER» в теле определения вашей процедуры для своих требований.

3
ответ дан adramazany 21 August 2018 в 15:10
поделиться

Вы должны использовать этот пример с AUTHID CURRENT_USER :

CREATE OR REPLACE PROCEDURE Create_sequence_for_tab (VAR_TAB_NAME IN VARCHAR2)
   AUTHID CURRENT_USER
IS
   SEQ_NAME       VARCHAR2 (100);
   FINAL_QUERY    VARCHAR2 (100);
   COUNT_NUMBER   NUMBER := 0;
   cur_id         NUMBER;
BEGIN
   SEQ_NAME := 'SEQ_' || VAR_TAB_NAME;

   SELECT COUNT (*)
     INTO COUNT_NUMBER
     FROM USER_SEQUENCES
    WHERE SEQUENCE_NAME = SEQ_NAME;

   DBMS_OUTPUT.PUT_LINE (SEQ_NAME || '>' || COUNT_NUMBER);

   IF COUNT_NUMBER = 0
   THEN
      --DBMS_OUTPUT.PUT_LINE('DROP SEQUENCE ' || SEQ_NAME);
      -- EXECUTE IMMEDIATE 'DROP SEQUENCE ' || SEQ_NAME;
      -- ELSE
      SELECT 'CREATE SEQUENCE COMPTABILITE.' || SEQ_NAME || ' START WITH ' || ROUND (DBMS_RANDOM.VALUE (100000000000, 999999999999), 0) || ' INCREMENT BY 1'
        INTO FINAL_QUERY
        FROM DUAL;

      DBMS_OUTPUT.PUT_LINE (FINAL_QUERY);
      cur_id := DBMS_SQL.OPEN_CURSOR;
      DBMS_SQL.parse (cur_id, FINAL_QUERY, DBMS_SQL.v7);
      DBMS_SQL.CLOSE_CURSOR (cur_id);
   -- EXECUTE IMMEDIATE FINAL_QUERY;

   END IF;

   COMMIT;
END;
/
2
ответ дан Chakib Arrama 21 August 2018 в 15:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: