暂无图片
Oracle 创建表报错
我来答
分享
暂无图片 匿名用户
Oracle 创建表报错

新创建一个用户test,只授权了登录权限和创建表的权限

create user test identified by 123;

grant connect to test;

grant create table to test;


我使用下面两种方式创建表,一个会报错,一个不会报错能创建表

1.create table t1 as select * from user_users;


2.create table t1(id number(10),name varchar2(30),status varchar2(2)) tablespace data;


请问各位大佬,这是什么原因???

我来答
添加附件
收藏
分享
问题补充
6条回答
默认
最新
文成

grant resource to test;

暂无图片 评论
暂无图片 有用 1
Gnos
2023-02-17
有授权建表权限的,第二个可以创建没报错,应该跟这个权限没关系
张sir

grant unlimited tablespace to test;

暂无图片 评论
暂无图片 有用 0
Gnos
2023-02-17
同样没有授权unlimited tablespace权限,为什么第二个语句就可以呢

你创建用户使用的默认users表空间,且未grant有效使用users表空间的权限;而你第二个建表语句是在data表空间中创建的

暂无图片 评论
暂无图片 有用 0
Gnos
2023-02-17
第二个语句不指定表空间,使用默认表空间在不授权unlimited tablespace权限的情况下也可以创建成功,这是为什么呢
Thomas

创建用户时没有明确DEFAULT TABLESPACE,那么建表时默认表空间是USERS。

第一条,新表里有一条记录。这条语句完成两个动作:建新表(定义数据字典),往表里查记录。

第二条,仅仅是建表(定义数据字典),不插入记录。

看一下这个参数:

SQL> show parameter deferred_segment_creation;

NAME TYPE VALUE
------------------------------------ --------------------------------- ------------------------------
deferred_segment_creation boolean TRUE

如果是TRUE,说明建表后不会在TABLESPACE里立即给该表划一定量的SEGMENT。我估计你这个参数为TRUE。那么第二条仅仅是建立数据字典,并未实质地在USERS表空间划SEGMENT,所以不报错。而第一条,因为向USERS表空间申请空间了(插入记录),但又没有对该用户授与相应表空间配额,比如grant unlimited tablespace to,或alter user xxx quota 100M on users; 所以报错。 

暂无图片 评论
暂无图片 有用 1
Gnos
2023-02-17
确实是,我的deferred_segment_creation参数的值是TRUE,我第一个创建语句select的表改成一个空表就能创建了,第二个语句表创建成功以后执行inert语句也是报错ORA-01950。谢谢!
Thomas

补充下,尽管没有针对任何表空间存数据的权限,但还是可以建表的。if deferred_segment_creation=true

暂无图片 评论
暂无图片 有用 1
Gnos

问题已关闭: 问题已经得到解决

暂无图片 评论
暂无图片 有用 0
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏