#oracle
#Oracle
Вопрос:
Я создал пользователя в oracle и предоставляю ему все привилегии, но когда я выполняю свою таблицу, я получаю сообщение об ошибке с указанием недостаточных привилегий, все таблицы до этой таблицы были успешными.
Это привилегии:
alter session set "_ORACLE_SCRIPT"=true;
create USER A1_18019497_ADDB7311 identified by Sileshan1234;
Grant all PRIVILEGES to A1_18019497_ADDB7311;
SELECT username, account_status FROM dba_users
Это моя таблица:
—Создание таблицы выставления счетов
CREATE TABLE A1_18019497_ADDB7311.BILLING(
BillID INT NOT NULL,
CustomerID INT REFERENCES CUSTOMER(CustomerID),
BillDate DATE NOT NULL,
EmployeeID VARCHAR(6) REFERENCES EMPLOYEE(EmployeeID),
PRIMARY KEY(BillID));
Это ошибка:
Error starting at line : 62 in command -
CREATE TABLE A1_18019497_ADDB7311.BILLING(
BillID INT NOT NULL,
CustomerID INT REFERENCES CUSTOMER(CustomerID),
BillDate DATE NOT NULL,
EmployeeID VARCHAR(6) REFERENCES EMPLOYEE(EmployeeID),
PRIMARY KEY(BillID))
Error report -
ORA-01031: insufficient privileges
01031. 00000 - "insufficient privileges"
*Cause: An attempt was made to perform a database operation without
the necessary privileges.
*Action: Ask your database administrator or designated security
administrator to grant you the necessary privileges
Комментарии:
1. Какой пользователь запускает этот скрипт?
2. Кроме того, знаете ли вы, что делает параметр _ORACLE_SCRIPT? Вы не должны его использовать. Это верно практически для всех недокументированных параметров подчеркивания.
Ответ №1:
все таблицы до этой таблицы были успешными
Итак, у вас есть другие инструкции CREATE TABLE в скрипте, и это только тот, который терпит неудачу?
Тогда проблема не в ПРЕДОСТАВЛЕНИИ ВСЕХ ПРИВИЛЕГИЙ. (Это проблематично по другим причинам).
Глядя на ваше заявление, я замечаю, что вы добавляете к имени таблицы префикс имени схемы:
CREATE TABLE A1_18019497_ADDB7311.BILLING
Означает ли это, что вы запускаете скрипт от другого пользователя, скажем, SYS или какой-либо другой учетной записи администратора базы данных? Если это так, это может объяснить проблему.
Ваша ПЛАТЕЖНАЯ таблица имеет два внешних ключа, но ссылки не содержат префикса имени таблицы со схемой. Это означает, что Oracle не будет ссылаться на таблицы в A1_18019497_ADDB7311, но в запущенной схеме или какой-либо другой схеме, которая предоставила общедоступные разрешения. Дело в том, что GRANT ALL PRIVILEGES предоставляет системные привилегии и ЛЮБЫЕ объектные привилегии, но не привилегии для отдельных объектов. Чтобы создать внешний ключ для таблицы в другой схеме, вам нужно, чтобы эта схема предоставила вам привилегию ССЫЛОК на таблицу.
В качестве альтернативы, если вы действительно хотите сохранить внешние ключи в схеме, которую вы пытаетесь создать, вам необходимо добавить в предложения внешнего ключа имя схемы:
CREATE TABLE A1_18019497_ADDB7311.BILLING(
BillID INT NOT NULL,
CustomerID INT REFERENCES A1_18019497_ADDB7311.CUSTOMER(CustomerID),
BillDate DATE NOT NULL,
EmployeeID VARCHAR(6) REFERENCES A1_18019497_ADDB7311.EMPLOYEE(EmployeeID),
PRIMARY KEY(BillID))
Лучшие способы достижения этой цели:
- Подключение к A1_18019497_ADDB7311 и запуск скрипта
- Используется
alter session set current_schema=A1_18019497_ADDB7311
для запуска скрипта от опытного пользователя без необходимости указывать префикс всех объектов, на которые ссылаются.
Пара кстати.
ПРЕДОСТАВЛЕНИЕ ВСЕХ ПРИВИЛЕГИЙ не является хорошей практикой. Явно предоставьте пользователям только те привилегии, которые им нужны. Приобретите хорошие привычки сейчас, и вы будете рады, что сделали это.
Не используйте _ORACLE_SCRIPT. Это предназначено для использования только Oracle. Это в значительной степени относится ко всем параметрам подчеркивания, которые недокументированы именно для того, чтобы препятствовать людям их использовать. К сожалению, это также делает их привлекательными для людей, особенно начинающих. Проблема в том, что, поскольку они недокументированы, их побочные эффекты легко пропустить.
В этом случае _ORACLE_SCRIPT используется Oracle для идентификации своих официальных скриптов. Зачем им это нужно? Установка параметра помечает все таблицы, созданные в сеансе, как ORACLE_MAINTAINED в DBA_TABLES. Что плохо для вашей ситуации, поскольку вызывает путаницу — вы больше не можете различать официальные таблицы Oracle для таблиц вашего приложения — и потенциально может вызвать проблемы с обновлениями и другими действиями по обслуживанию системы. Вы не получили никакой выгоды от использования этого параметра, но повредили свой словарь данных: не выгодная сделка.
Не используйте этот параметр в своих собственных сценариях. И, как правило, не используйте параметры подчеркивания, если вы точно не знаете, что делаете. В Интернете есть много плохих советов по использованию параметров подчеркивания от людей, которые не понимают последствий.
Ответ №2:
Вам придется предоставлять CREATE TABLE
привилегии отдельно, они не включены all privileges
.
Кстати, я бы посоветовал вам не делать этого таким образом. Не предоставляйте ненужные привилегии, особенно если вы не знаете, кто и как собирается (ab) их использовать. Предоставляйте только требуемые привилегии, по одному, когда это необходимо. Если вы хотите, создайте роль и предоставьте эти привилегии роли, а затем предоставьте роль своим пользователям.