Как системный пользователь у меня возникает эта ошибка: ORA-01031: недостаточно прав.
У меня есть хранимая процедура удаления разделов. Перед тем как начать, мне нужно удалить ограничение.
Я установил хранимую процедуру на системного пользователя. Когда я тестирую процедуру, я получаю эту ошибку: "ORA-01031: недостаточные привилегии".
Это фрагмент кода, который я написал:
BEGIN
EXECUTE IMMEDIATE 'ALTER TABLE USER_NAME.TABLE_NAME DISABLE CONSTRAINT CONSTRAINT_NAME';
EXCEPTION
WHEN OTHERS THEN
O_sCodError := 'NO_OK';
O_sDesError := 'Error at DISABLE CONSTRAINT_NAME: ' || SQLERRM || ';';
RETURN;
END;
Что ж, поскольку я выполняю хранимую процедуру как системную, я не понимаю причину этой ошибки. И я думаю, что в конечном итоге я думаю о той же ошибке, когда пытаюсь удалить раздел.
3 ответа
Вы должны предоставить учетной записи SYSTEM прямую привилегию (не с ролью) для запуска ALTER TABLE в целевой таблице, потому что по умолчанию роли не включены в хранимых процедурах: https://asktom.oracle.com/Misc/RolesAndProcedures.html.
Пытаться:
grant alter any table to system;
или
grant alter table on user_name.table_name to system;
У меня работает на 11g XE:
SQL> show user
USER is "SCOTT"
SQL>
SQL> create table test
2 (id number constraint pk_test primary key,
3 name varchar2(20)
4 );
Table created.
SQL> connect system
Enter password:
Connected.
SQL> begin
2 execute immediate 'alter table scott.test disable constraint pk_test';
3 return;
4 end;
5 /
PL/SQL procedure successfully completed.
SQL>
Пожалуйста, следуйте этому примеру и выполните его в своей базе данных. Опубликуйте результат (отредактировав вопрос, а не как комментарий).
Во-первых, вы никогда не должны устанавливать собственный код в схему Oracle по умолчанию, такую как SYSTEM. Поместите свой код в специальную схему приложения. Поскольку он содержит динамический SQL (немедленное выполнение), вы можете рассмотреть вопрос о том, чтобы сделать его процедурой с "правами вызывающего", а затем предоставить права на выполнение для пользователя, который будет его выполнять.
Тем не менее, в Oracle 11g те, кто использует привилегии для запуска блока PL/SQL, должны иметь прямые разрешения на базовую таблицу, а не унаследованные разрешения через такую роль, как администратор баз данных. Если процедура имеет "права определения", то схема, которой принадлежит процедура, должна иметь прямые привилегии для таблицы. Если "права инициатора", то пользователь, выполняющий процедуру, должен иметь права.
См. Эту ссылку для получения дополнительных сведений: Выполнить немедленно в процедуре Oracle