Ошибка ORA-01031: insufficient privileges в Oracle DB — настройка прав
- Ошибка
ORA-01031: insufficient privilegesпри выполнении DDL/DML операций, создании пакетов или процедур. - Невозможность подключиться локально под учетной записью
sysdba(sqlplus / as sysdba). - Сбой выполнения административных команд (
ALTER SYSTEM,GRANT,CREATE USER).
1. Проверка прямых системных привилегий и ролей пользователя
-- Проверка системных привилегий
SELECT * FROM dba_sys_privs WHERE grantee = 'APP_USER';
-- Проверка назначенных ролей
SELECT * FROM dba_role_privs WHERE grantee = 'APP_USER';
-- Проверка объектных прав на таблицы
SELECT * FROM dba_tab_privs WHERE grantee = 'APP_USER';2. Выдача необходимых системных прав
-- Разрешение создания сессий и таблиц
GRANT CREATE SESSION, CREATE TABLE, CREATE VIEW TO APP_USER;
-- Выдача прав на выполнение пакета
GRANT EXECUTE ON DBMS_LOCK TO APP_USER;3. Решение сбоя 'sqlplus / as sysdba' на уровне Linux
Если ORA-01031 возникает при локальном входе без пароля через сокет ОС, убедитесь, что пользователь ОС входит в группу dba:
# Проверка групп текущего пользователя Linux
id
# Добавление пользователя в группу dba
usermod -aG dba oracle4. Проверка файла паролей (Password File) для удаленного SYSDBA
-- Проверка пользователей с административными привилегиями
SELECT * FROM v$pwfile_users;Если файл паролей поврежден, пересоздайте его утилитой orapwd:
orapwd file=$ORACLE_HOME/dbs/orapw$ORACLE_SID password=MySysPassword entries=10 force=y Частые вопросы (FAQ)
Почему ORA-01031 возникает при создании представления (CREATE VIEW), хотя на таблицу есть SELECT?
Для создания VIEW требуется прямая системная привилегия CREATE VIEW, а также прямые (не через роли) права SELECT на все таблицы, участвующие в представлении.
Что такое опция WITH ADMIN OPTION / WITH GRANT OPTION?
Опция WITH GRANT OPTION позволяет пользователю передавать полученные объектные права другим схемам. Без этой опции попытка передать права вызовет ORA-01031.
Влияет ли параметр REMOTE_LOGIN_PASSWORDFILE на ORA-01031?
Да. Если remote_login_passwordfile установлен в NONE, подключение под SYSDBA по сети невозможно и будет отклоняться с ORA-01031. Значение должно быть EXCLUSIVE.
Почему триггер падает с ORA-01031 при вызове динамического SQL (EXECUTE IMMEDIATE)?
Динамический SQL внутри хранимого кода выполняется с прямыми правами владельца схемы. Роли, назначенные владельцу, игнорируются.