for aTab in (select table_name from dba_tables where owner = 'SDE') loop
execute immediate 'ALTER TABLE SDE.' ||aTab.table_name|| ' MOVE TABLESPACE SDEBUS_DT';
end loop;
for aInd in (select index_name from dba_indexes where owner = 'SDE') loop
execute immediate 'ALTER INDEX SDE.' ||aInd.index_name|| ' REBUILD TABLESPACE SDEBUS_IX';
end loop;
-- omit the "execute" if you want to run the following output
-- in a BEGIN/END block instead of running each line, one at a time.
select 'execute DBMS_REDEFINITION.REDEF_TABLE(uname=>''' ||
owner || ''', tname=>' ||
'''' || table_name || '''' ||
', table_part_tablespace=>''SDEBUS_DT'' , index_tablespace=>''SDEBUS_IX'');' as cmd from dba_tables where owner='MARK.STEWART';
CMD
---------------------------------------------------------
execute DBMS_REDEFINITION.REDEF_TABLE(uname=>'MARK.STEWART', tname=>'DBMSHP_RUNS', table_part_tablespace=>'SDEBUS_DT' , index_tablespace=>'SDEBUS_IX');
execute DBMS_REDEFINITION.REDEF_TABLE(uname=>'MARK.STEWART', tname=>'DBMSHP_FUNCTION_INFO', table_part_tablespace=>'SDEBUS_DT' , index_tablespace=>'SDEBUS_IX');
您也可以使用简单的
ALTER TABLE/INDEX
命令但是
DBMS_REDEFINITION.REDEF_TABLE
比 更通用ALTER TABLE/INDEX
,例如当用户有分区表时。您想要轻松做的事情(假设您具有适当的权限)是调用 PL/SQL 过程DBMS_REDEFINITION.REDEF_TABLE,您可以使用它来更改诸如数据和索引的表空间之类的东西。这是用于移动名为 的表的代码片段
MY_DATA_TABLE
。要执行多个操作,您需要在每个表中调用一次。但在你开始之前,先检查一下你的
SDE
所有者是否对表空间有权限。此外,如果用户调用了这些命令,则该用户将需要权限。SDEBUS_DT
SDEBUS_IX
SDE
CREATE TABLE
CREATE MVIEW
现在,如果您想遍历多个表,请运行如下所示的 SQL,它将显示要复制/粘贴的命令。是的,您可以在 PL/SQL 循环中执行以下操作,但我不经常这样做以记住 3 或 4 种方法中的哪一种,而无需查找!