我是oracle的新手。我想问一下是否存在一个可以将表a复制到表b的单个命令,这样表b将具有与表a相同的数据,相同的结构和相同的访问权限?我想复制一个包含相同行为的表。
答案 0 :(得分:2)
如果我错了,请有人纠正我,但我不认为你可以用特权/索引来复制它。这可能是因为您需要为索引,主键等提供新名称,并且数据库将不知道需要为这些命名的名称。所以你可以这样做。
运行此命令以获取所需表的DDL,然后将其替换为新表名。 (我的源表是TZ_TEST
,我将创建TZ_TEST_NEW
。(感谢get {ddl命令的这个answer)
select replace(
(SELECT dbms_metadata.get_ddl( 'TABLE', 'TZ_TEST' ) FROM DUAL),
'TZ_TEST',
'TZ_TEST_NEW')
来自双
执行DDL
使用此方法获取授予权限
select replace(
(select DBMS_METADATA.GET_DEPENDENT_DDL('OBJECT_GRANT','TZ_TEST') FROM DUAL),
'TZ_TEST',
'TZ_TEST_NEW') from dual
同样使用DBMS_METADATA来获取约束/索引等。执行这些属性。
插入数据
insert into TZ_TEST_NEW
select * from TZ_TEST
请注意,如果您有自动生成的主键,那么在插入数据时,您需要从insert
和select
语句中排除该列。
如果我错过了什么,请随时添加。
此外,我们可以创建一个程序,所有这些,但你需要小心所有步骤。所以一旦你做了几次并且它有效,我们就可以为它创建一个程序。
答案 1 :(得分:0)
如果您使用的是TOAD for Oracle,请选择表名并按F4。然后在描述窗口中选择脚本选项卡。
这将生成表脚本。您只需使用“搜索/替换”来更改表名并执行脚本。
新创建的表将包含相同的行为。
答案 2 :(得分:0)
我会分两步完成:
create table as select ..
,首先使用带有数据的新名称创建表的副本。您还可以使用 PARALLEL 和 NOLOGGING 功能来提高效果。例如,
create table t parallel 4 nologging as select * from emp;
CTAS比传统插入快得多。