我正在处理我们的数据库用户权限,我面临着一个令人困惑的问题。我首先创建了一个没有任何配额的用户(user1),并授予他具有系统特权的角色CONNECT(创建会话)。之后我授予他(创建表)权限。用户尝试创建一个表,他成功地在他的表空间中创建了一个表!我的问题是:
根据我的理解,用户必须有配额来创建任何对象,该用户如何创建表格?
是否有任何权限或角色隐含地为用户提供配额?
此致
答案 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
。只是我经常注意到的事情。