可以复制表结构的命令,Oracle中的所有约束和特权

时间:2015-10-19 03:52:47

标签: sql oracle

我是oracle的新手。我想问一下是否存在一个可以将表a复制到表b的单个命令,这样表b将具有与表a相同的数据,相同的结构和相同的访问权限?我想复制一个包含相同行为的表。

3 个答案:

答案 0 :(得分:2)

如果我错了,请有人纠正我,但我不认为你可以用特权/索引来复制它。这可能是因为您需要为索引,主键等提供新名称,并且数据库将不知道需要为这些命名的名称。所以你可以这样做。

  1. 运行此命令以获取所需表的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') 
    

    来自双

  2. 执行DDL

  3. 使用此方法获取授予权限

    select replace(
    (select DBMS_METADATA.GET_DEPENDENT_DDL('OBJECT_GRANT','TZ_TEST') FROM DUAL),
    'TZ_TEST',
    'TZ_TEST_NEW') from dual
    

    同样使用DBMS_METADATA来获取约束/索引等。执行这些属性。

  4. 插入数据

    insert into TZ_TEST_NEW
    select * from TZ_TEST
    
  5. 请注意,如果您有自动生成的主键,那么在插入数据时,您需要从insertselect语句中排除该列。

  6. 如果我错过了什么,请随时添加。

    此外,我们可以创建一个程序,所有这些,但你需要小心所有步骤。所以一旦你做了几次并且它有效,我们就可以为它创建一个程序。

答案 1 :(得分:0)

如果您使用的是TOAD for Oracle,请选择表名并按F4。然后在描述窗口中选择脚本选项卡。

这将生成表脚本。您只需使用“搜索/替换”来更改表名并执行脚本。

新创建的表将包含相同的行为。

答案 2 :(得分:0)

我会分两步完成:

  1. 使用 CTAS ,即create table as select ..,首先使用带有数据的新名称创建表的副本。您还可以使用 PARALLEL NOLOGGING 功能来提高效果。
  2. 例如,

    create table t parallel 4 nologging as select * from emp;
    
    1. 使用 DBMS_METADATA.GET_DEPENDENT_DDL 获取索引,约束等关联结构并执行它。但是,您需要先将table_name替换为您在步骤1中创建的新table_name。
    2. CTAS比传统插入快得多。