首页 > 解决方案 > 如何更改 Oracle 中模式的默认表空间

问题描述

有一个名为 Docker 的模式,其中有名为 TABLE2、TABLE3 的表。

例子

SELECT * FROM all_all_tables WHERE TABLE_name= 'TABLE3';

此外,Docker 模式属于 DEFAULT TABLESPACE SYSTEM 表空间。

select 
    username
,   default_tablespace from dba_users WHERE USERNAME = 'DOCKER';

以下语法用于更改模式的默认表空间。(TS3 表空间已经存在)

ALTER USER docker DEFAULT tablespace TS3;

然后,当我再次搜索时,我发现 DEFAULT TABLESPACE 已更改。

select 
    username
,   default_tablespace from dba_users WHERE USERNAME = 'DOCKER';

而且,当然,我以为指定了TABLE2和TABLE3的表空间也会改成TS3,于是执行了下面的语句。

但是,该表的表空间是 SYSTEM,而不是 TS3。我很好奇为什么它没有改变,我想知道如何。SELECT * FROM all_all_tables WHERE TABLE_name='TABLE3';

标签: oracleschematablespace

解决方案


默认表空间就是这样——创建段时的默认值(通常是表或索引,但段可以是表的分区、物化视图或其他任何需要空间的东西)并且不指定表空间。一旦您创建了一个段并将其分配给特定的表空间,除非您移动它,否则它将保留在该表空间中。

假设您使用的是 12.2 或更高版本,因此可以选择在线移动(在其他版本中,您需要删除online关键字)

alter table table3
  move online tablespace ts3;

你需要为每张桌子这样做。如果表空间中还有索引system,您也需要移动这些索引

alter index index_name
  rebuild online tablespace ts3;

根据所涉及的表和索引的数量,您可能需要编写一些动态 SQL 来为您生成各种alter tablealter index语句。


推荐阅读