Ошибка создания таблицы хранения столбца вложенной таблицы - PullRequest
0 голосов
/ 11 мая 2018

Oracle Database 12c Enterprise Edition, выпуск 12.1.0.2.0 - 64-разрядная версия

Требуется помощь экспертов для устранения следующей ошибки:

CREATE TABLE "ABC" 
   (----
    ----
    "STATUSES" "INTLIST" , 
    ---- 
    "CHAIN_DETAILS" "CHAIN_CFG_LIST" , 
    -----
   ) 
 NESTED TABLE "STATUSES" STORE AS "OP_STATUSES_NT" 
 RETURN AS VALUE
 NESTED TABLE "CHAIN_DETAILS" STORE AS "op_chains" 
 RETURN AS VALUE;

Дает сообщение об ошибке:

ORA-02320: Ошибка создания таблицы хранения столбцов вложенной таблицы. STATUSES
ORA-01950: нет разрешений для табличного пространства

1 Ответ

0 голосов
/ 11 мая 2018

Полагаю, у пользователя нет квоты на табличное пространство по умолчанию.Вы можете найти табличное пространство по умолчанию, запросив user_users или dba_users при проверке другого пользователя, а также квоту от user_ts_quotas или dba_ts_quotas.Значение -1 означает неограниченное.Присоединитесь к ним, чтобы увидеть свою квоту для табличного пространства по умолчанию:

select u.username
     , u.default_tablespace
     , tq.max_bytes
from   user_users u
       left join user_ts_quotas tq
            on  tq.tablespace_name = u.default_tablespace;

Это будет проблемой для любой таблицы, но если для deferred_segment_creation установлено значение true (по умолчанию), то ошибка появится толькокогда вы пытаетесь добавить строку в таблицу, так как это первый запрос на хранение.

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

Пример использования тестового пользователя 'demo':

sqlplus / as sysdba

SQL*Plus: Release 12.2.0.1.0 Production on Fri May 11 10:41:51 2018

Copyright (c) 1982, 2016, Oracle.  All rights reserved.


Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

SQL> create user demo identified by demo;

User created.

SQL> grant create session, create table, create type to demo;

Grant succeeded.

Подключиться как demo:

SQL> conn demo/demo
Connected.

SQL> col username format a15
SQL> col default_tablespace format a20

SQL> select u.username
  2       , u.default_tablespace
  3       , tq.max_bytes
  4  from   user_users u
  5         left join user_ts_quotas tq
  6              on  tq.tablespace_name = u.default_tablespace;

USERNAME        DEFAULT_TABLESPACE    MAX_BYTES
--------------- -------------------- ----------
DEMO            USERS

Мое табличное пространство по умолчанию USERS иУ меня нет квоты, но я могу создать таблицу:

SQL> create table demotable(id integer);

Table created.

У меня проблема только в том случае, когда мне нужно какое-то реальное хранилище:

SQL> insert into demotable values (1);
insert into demotable values (1)
            *
ERROR at line 1:
ORA-01950: no privileges on tablespace 'USERS'

Теперь попробуйте использовать вложенную таблицу:

SQL> create or replace type demo_tt as table of number(1);
  2  /

Type created.

SQL> create table abc
  2  ( id integer
  3  , statuses demo_tt )
  4  nested table statuses store as op_statuses_nt return as value;
create table abc
*
ERROR at line 1:
ORA-02320: failure in creating storage table for nested table column STATUSES
ORA-01950: no privileges on tablespace 'USERS'

Моему пользователю demo нужна квота на табличное пространство USERS (обычно вы предоставляете unlimited или ничего, но просто для удовольствия давайте выделим 1 МБ ...)

SQL> conn / as sysdba
Connected.

SQL> alter user demo quota 1M on users;

User altered.

SQL> conn demo/demo
Connected.

SQL> select u.username
  2       , u.default_tablespace
  3       , tq.max_bytes
  4  from   user_users u
  5         left join user_ts_quotas tq
  6              on  tq.tablespace_name = u.default_tablespace;

USERNAME        DEFAULT_TABLESPACE    MAX_BYTES
--------------- -------------------- ----------
DEMO            USERS                   1048576

Повторите попытку создания таблицы:

SQL> create table abc
  2  ( id integer
  3  , statuses demo_tt )
  4  nested table statuses store as op_statuses_nt return as value;

Table created.

SQL> insert into abc (id, statuses) values (1, demo_tt(1,2,3));

1 row created.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...