是"创建表"或"创建任何表" Privilages隐含地向用户授予配额?

时间:2018-04-18 10:29:16

标签: oracle oracle11g

我正在处理我们的数据库用户权限,我面临着一个令人困惑的问题。我首先创建了一个没有任何配额的用户(user1),并授予他具有系统特权的角色CONNECT(创建会话)。之后我授予他(创建表)权限。用户尝试创建一个表,他成功地在他的表空间中创建了一个表!我的问题是:

  1. 根据我的理解,用户必须有配额来创建任何对象,该用户如何创建表格?

  2. 是否有任何权限或角色隐含地为用户提供配额?

  3. 此致

1 个答案:

答案 0 :(得分:2)

配额未被隐式授予。但创建表格并不一定需要任何存储空间,因此不一定需要配额:

create table t42 (id number);

Table T42 created.

select segment_type, bytes from user_segments where segment_name = 'T42';

no rows selected

向表中添加数据确实需要存储,因此需要配额:

insert into t42 (id) values (1);

1 row inserted.

select segment_type, bytes from user_segments where segment_name = 'T42';

SEGMENT_TYPE            BYTES
------------------ ----------
TABLE                   65536

如果所有者在表空间上没有配额,那么当他们尝试插入时会出错;当他们确实有配额并且当然也试图超过它时就是这种情况(虽然错误会有所不同)。

此行为是由于延迟段创建;默认行为由an initialisation parameter控制。您可以在创建表with the segment creation clause期间覆盖它。

drop table t42 purge;

Table T42 dropped.

create table t42 (id number) segment creation immediate;

Table T42 created.

select segment_type, bytes from user_segments where segment_name = 'T42';

SEGMENT_TYPE            BYTES
------------------ ----------
TABLE                   65536

Read more in the documentation

顺便提一下,如果您创建一个包含延迟段创建的表,则dbms_metadata.get_ddl会显示该表;如果您随后插入一行以强制创建细分,dbms_metadata.get_ddl会更改为SEGMENT CREATION IMMEDIATE。这可能不是预期的。使用DROP ALL STORAGE子句截断表将删除段,并将DDL还原为SEGMENT CREATION DEFERRED。只是我经常注意到的事情。