ALL_LOG_GROUPS не содержал информации о таблицах, доступных текущему пользователю - PullRequest
1 голос
/ 18 июня 2020

Я создал пользователя и подключился к oracle с этим пользователем (user_privlgs). Также я добавляю гранты для выбора некоторой таблицы, которая находится в другой схеме:

 GRANT ALL PRIVILEGES ON <another user>.APITEST_1 TO user_privlgs;
  GRANT SELECT ON <another user>.APITEST_1 TO user_privlgs;
  GRANT UPDATE ON <another user>.APITEST_1 TO user_privlgs;
 GRANT ALTER ON <another user>.APITEST_1 TO user_privlgs;

DDL таблицы:

CREATE TABLE <another user>."APITEST_1"
   (    "ID" NUMBER,
    "COLUM_1" VARCHAR2(50 BYTE),
    "COLUM_2" VARCHAR2(50 BYTE) NOT NULL ENABLE,
     SUPPLEMENTAL LOG DATA (ALL) COLUMNS
   ) SEGMENT CREATION DEFERRED
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
 NOCOMPRESS LOGGING
  TABLESPACE "USERS" ;

Таблица содержит информацию о дополнительных журналах.

И попытался выбрать данные из ALL_LOG_GROUPS, но информации о .APITEST_1 нет. А в oracle сайте https://docs.oracle.com/cd/B19306_01/server.102/b14237/statviews_1094.htm#i1581389 написано, что - ALL_LOG_GROUPS описывает определения групп журналов по таблицам, доступным текущему пользователю. Но это. "APITEST_1" доступен пользователю user_privlgs ... Знаете ли вы, какие гранты необходимы для выбора данных .APITEST_1 из ALL_LOG_GROUPS?

1 Ответ

2 голосов
/ 18 июня 2020

GRANT ALL PRIVILEGES ON table_name TO user должно быть достаточно для предоставленного пользователю доступа к строке ALL_LOG_GROUPS для table_name, подключенного как user.

Я не могу воспроизвести вашу проблему с oracle 19 c.

SQL> select banner from v$version where rownum=1;

BANNER
--------------------------------------------------------------------------------
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production

SQL> --
SQL> create user privuser identified by privuser;

User created.

SQL> grant create session to privuser;

Grant succeeded.

SQL> --
SQL> create user anotheruser identified by anotheruser;

User created.

SQL> alter user anotheruser quota unlimited on users;

User altered.

SQL> grant create session, create table to anotheruser;

Grant succeeded.

SQL> --
SQL> connect anotheruser/anotheruser
Connected.

Session altered.

SQL> show user;
USER is "ANOTHERUSER"
SQL> CREATE TABLE apitest
  2  (    ID NUMBER,
  3       COLUM_1 VARCHAR2(50 BYTE),
  4       COLUM_2 VARCHAR2(50 BYTE) NOT NULL ENABLE,
  5       SUPPLEMENTAL LOG DATA (ALL) COLUMNS
  6  );

Table created.

SQL> 
SQL> select owner, log_group_name, table_name
  2  from user_log_groups
  3  where table_name='APITEST';

OWNER            LOG_GROUP_NAME   TABLE_NAME
-------------------- -------------------- --------------------
ANOTHERUSER      SYS_C007872      APITEST

SQL> grant all privileges on apitest to privuser;

Grant succeeded.

SQL> --
SQL> connect privuser/privuser;
Connected.

Session altered.

SQL> show user
USER is "PRIVUSER"
SQL> select owner, log_group_name, table_name
  2  from all_log_groups
  3  where table_name='APITEST';

OWNER            LOG_GROUP_NAME   TABLE_NAME
-------------------- -------------------- --------------------
ANOTHERUSER      SYS_C007872      APITEST

SQL> 
...