Полагаю, у пользователя нет квоты на табличное пространство по умолчанию.Вы можете найти табличное пространство по умолчанию, запросив 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.