Ошибка вставки данных с использованием owner.table в Oracle, работает без владельца - PullRequest
2 голосов
/ 06 ноября 2019

Я создал таблицу в Oracle со следующим сценарием:

CREATE TABLE MYOWNER.MY_TABLE (
       TBL_ID          NUMBER(11) NOT NULL,
       ...
)TABLESPACE MYOWNER_TABLESPACE;

CREATE PUBLIC SYNONYM TBL FOR MYOWNER.MY_TABLE;
GRANT DELETE, INSERT, SELECT, UPDATE ON MYOWNER.MY_TABLE TO MYOWNER;

Следующий оператор вставки работает, используя MYOWNER:

Insert into TBL
   (TBL_ID, ...)
 Values
   (8, ...);

Но если я добавлювладелец операторов вставки (для соглашений сценариев в компании, в которой я работаю, я должен добавить их) выдает ошибку ORA-00942: table or view does not exist. Оператор вставки, который не работает:

Insert into MYOWNER.TBL
   (TBL_ID, ...)
 Values
   (8, ...);

Вопрос: что можно сделать, чтобы оператор вставки Insert into MYOWNER.TBL работал правильно? Что я делаю не так?

Ответы [ 2 ]

2 голосов
/ 06 ноября 2019

Допустим, у вас есть таблица:

SQL> conn alek/alek@test
Connected.
SQL> create table alek.alek_table(n number);

Table created.

И вы создаете для нее PUBLIC SYNONYM, чтобы к ней можно было получить доступ с другим именем, без необходимости писать схему при любом входе в систему. пользователь (с необходимыми разрешениями):

SQL> create public synonym a_tab for alek_table;

Synonym created.

Вы можете использовать синоним для доступа к таблице

SQL> select * from a_tab;

no rows selected

Вы можете даже использовать простое имя таблицы, если вы войдете в систему с владельцемпользователь:

SQL> select * from alek_table;

no rows selected

Вы всегда можете использовать схему schema.table:

SQL> select * from alek.alek_table;

no rows selected

Но вы не можете использовать схему schema.synonym:

SQL> select * from alek.a_tab;
select * from alek.a_tab
                   *
ERROR at line 1:
ORA-00942: table or view does not exist

, потому чтоВы создали синоним public, и он не считается объектом схемы, а public.

Иными словами, если вы создаете частный синоним, у вас есть объект схемы и вы можете использовать схему. синоним для доступа к таблице:

SQL> create synonym a_tab_private for alek_table;

Synonym created.

SQL> select * from alek.a_tab_private;

no rows selected
1 голос
/ 06 ноября 2019

Вам необходимо:

CREATE SYNONYM MYOWNER.TBL FOR MYOWNER.MY_TABLE

PUBLIC

Укажите PUBLIC для создания общедоступного синонима. Публичные синонимы доступны всем пользователям. Однако каждый пользователь должен иметь соответствующие привилегии для базового объекта, чтобы использовать синоним.

При разрешении ссылок на объект Oracle Database использует общедоступный синоним только в том случае, если объект не предшествует схеме и несопровождаемый ссылкой на базу данных.

Если вы пропустите это предложение, то синоним будет закрытым и доступен только внутри его схемы. Частное имя синонима должно быть уникальным в его схеме.

Примечания к общедоступным синонимам Следующие примечания относятся к общедоступным синонимам:

Если вы создаете общедоступный синоним и впоследствии у него есть зависимые таблицы или зависимые допустимые значенияпользовательские типы объектов, то вы не можете создать другой объект базы данных с тем же именем, что и синоним в той же схеме, что и зависимые объекты.

Старайтесь не создавать общедоступный синоним с тем же именем, что и существующийсхемы. В этом случае все модули PL / SQL, использующие это имя, будут признаны недействительными.

схема

Укажите схему, которая будет содержать синоним. Если вы опустите схему, Oracle Database создаст синоним в вашей собственной схеме. Вы не можете указать схему для синонима, если вы указали PUBLIC.

From: https://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_7001.htm

...