создать полную копию существующей таблицы в Oracle - PullRequest
0 голосов
/ 08 октября 2018

Я знаю, что могу легко создать копию таблицы с create table t1 select * from table2; Но мне нужно скопировать:

  • столбцы
  • комментарии
  • табличное пространство
  • индексы
  • гранты
  • триггеры
  • клавиши
  • значения по умолчанию
  • ...
  • любые другие зависимости

Есть ли способ сделать это с помощью процедуры pl/sql?Моя версия Oracle: 11R2 .

SQL таблицы:

-- Create table

    create table SCHEMA.MY_TABLE
    (
      id      number(1),
      name    varchar2(30),
      dat     date
    )
    tablespace MY_TS
      pctfree 10
      initrans 1
      maxtrans 255
      storage
      (
        initial 10M
        next 1M
        minextents 1
        maxextents unlimited
      );
    -- Add comments to the table 
    comment on table SCHEMA.MY_TABLE
      is 'MY TABLE';
    comment on column SCHEMA.MY_TABLE.ID
      is 'id';
    comment on column SCHEMA.MY_TABLE.NAME
      is 'name of operation';
    comment on column SCHEMA.MY_TABLE.DAT
      is 'date of operation';

    grant select on SCHEMA.MY_TABLE to PUBLIC;

Ответы [ 2 ]

0 голосов
/ 08 октября 2018

Если вы используете TOAD, SQL DEVELOPER, вы можете получить доступ к Таблице SQL с помощью f4 в toad и с помощью поиска abject, а затем SQL в SQL developer.Это даст вам сценарий SQL для создания таблицы.Это будет иметь все индексы, значения по умолчанию, структуру столбцов, гранты, комментарии столбцов, табличное пространство.Для триггеров вы можете получить это из раздела DBA_triggers / Triggers вышеупомянутого метода.Просто измените имя таблицы и выполните оператор, а затем вставьте все данные из базовой таблицы в новую таблицу.

0 голосов
/ 08 октября 2018

Вы можете использовать пакет DBMS_REDEFINITION, который может делать копию всей таблицы, включая комментарии и т. Д. Он также «дефрагментирует» новую копию, занимая меньше места, чем исходная таблица.

Дополнительная информацияat https://docs.oracle.com/database/121/ARPLS/d_redefi.htm#ARPLS042

Пример по запросу:

Итак, давайте создадим тестовую схему, таблицу и заполните ее некоторыми данными:

CREATE USER "TEST_SCHEMA" IDENTIFIED BY "TEST";
GRANT UNLIMITED TABLESPACE TO "TEST_SCHEMA";

CREATE TABLE "TEST_SCHEMA"."NAMES" ("ID" NUMBER, "NAME" VARCHAR2(25), PRIMARY KEY("ID"));

INSERT INTO "TEST_SCHEMA"."NAMES" VALUES (1, 'joe');
INSERT INTO "TEST_SCHEMA"."NAMES" VALUES (2, 'pete');
INSERT INTO "TEST_SCHEMA"."NAMES" VALUES (3, 'mark');

Теперь мы можем проверитьсодержимое тестовой таблицы:

SELECT * FROM "TEST_SCHEMA"."NAMES";

Начнем процесс копирования с создания пустой таблицы в точности так, как выглядит исходная таблица (используя WHERE 1=0, который не будет принимать никаких данных).

CREATE TABLE "TEST_SCHEMA"."NAMES_COPY" AS SELECT * FROM "TEST_SCHEMA"."NAMES" "A1" WHERE 1=0;

Здесь вы можете настроить паралелляцию и т. Д., Подготовить данные и т. Д. После того, как все будет сделано, давайте запустим процесс REDEFINITION:

BEGIN
  DBMS_REDEFINITION.START_REDEF_TABLE('TEST_SCHEMA','NAMES','NAMES_COPY');
END;
/

Когда содержимое скопировано, нам нужно скопировать каждый объект, которыйзависит от таблицы (например, триггеры, индексы и т. д.)

DECLARE
  num_errors PLS_INTEGER;
BEGIN
  DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS ('TEST_SCHEMA',  'NAMES',    'NAMES_COPY',
    DBMS_REDEFINITION.CONS_ORIG_PARAMS, TRUE, TRUE, TRUE, TRUE, num_errors);
END;
/

Мы можем проверить, возникли ли какие-либо ошибки при копировании зависимостей с помощью этого запроса:

SELECT "OBJECT_NAME", "BASE_TABLE_NAME", "DDL_TXT" FROM DBA_REDEFINITION_ERRORS;

Есливсе в порядке, мы можем закончить процедуруss:

BEGIN
  DBMS_REDEFINITION.FINISH_REDEF_TABLE ('TEST_SCHEMA', 'NAMES',    'NAMES_COPY');
END;
/

И вуаля, новая таблица похожа на клонированную овечку Долли со всем, что в ней есть:

SELECT * FROM "TEST_SCHEMA"."NAMES_COPY";

Теперь, чтобы очистить схему тестирования, запустите:

DROP TABLE "TEST_SCHEMA"."NAMES";
DROP TABLE "TEST_SCHEMA"."NAMES_COPY";
DROP USER "TEST_SCHEMA" CASCADE;

Надеюсь, это помогло.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...