Могу ли я изменить ограничения одной таблицы, используя ограничения другой таблицы? - PullRequest
1 голос
/ 29 мая 2019

Мне пришлось сбросить таблицу и переделать ее с помощью архива. В процессе я потерял ограничения таблицы - такие вещи, как первичный ключ - триггеры, индексы и многое другое. У меня, однако, та же таблица в другой БД, которая имеет все соответствующие ограничения.

Я пытался добавить ограничения, триггеры и индексы вручную, но их слишком много.

Мне было интересно, смогу ли я сделать что-то вроде:

alter table t73
  modify col_n....col_n+1
  using (select constraints from t73@otherdb)

Ответы [ 2 ]

2 голосов
/ 29 мая 2019

Нет, это не сработает.

Что вы можете сделать, это использовать некоторый графический интерфейс (например, TOAD или SQL Developer), найти таблицу t73, взглянуть на Script , который содержит все команды (CREATE TABLE, CREATE INDEX , CREATE CONSTRAINT, ...) и скопируйте / вставьте нужные вам файлы и выполните их в текущей базе данных.

Это было бы быстро .

Если вы хотите сделать это правильно (вы знаете, притворяясь, что знаете, что делаете, точно так же, как я), тогда посмотрите DBMS_METADATA.GET_DDL и извлеките эти команды из базы данных.

Окончательный результат должен быть таким же.

1 голос
/ 29 мая 2019

это пример ниже, как вы можете использовать dbms_metadata.get_ddl пакет Oracle

create table EX_EMPLOYEe ( id number(5) null, name varchar2(100))
/
alter table ex_Employee add constraint PK_EX_EMPLOYEE primary key (id)
/
alter table ex_Employee add constraint FK_EX_EMPLOYEE foreign key (id)
references ex_Employee1 (id)
/
create table EX_EMPLOYEe1 ( id number(5) null, name varchar2(100))
/
alter table ex_Employee1 add constraint PK_EX_EMPLOYEE1 primary key (id)

alter table SYS_PARAM_KEY_LABEL
  add constraint FK1_SYS_PARAM_KEY_LABEL foreign key (KEY_GROUP_ID)
  references SYS_PARAM_KEY_GROUP (KEY_GROUP_ID);
/
CREATE INDEX IDX_EX_EMPLOYEe on ex_employee(name)
/
  Create or replace PROCEDURE P_EX_EMPLOYEe as
  begin
  select id from ex_employee where rownum=1;
  end;
/
CREATE OR REPLACE TRIGGER TRG_EX_EMPLOYEe AFTER DELETE ON EX_EMPLOYEe
FOR EACH ROW 
BEGIN
  DELETE FROM ex_employee1 WHERE id = :OLD.ID;
END;
/
select to_char( dbms_metadata.get_ddl('CONSTRAINT', c.constraint_name)) from user_constraints c where table_name='EX_EMPLOYEE' 
and c.constraint_type='P'
union
select to_char( dbms_metadata.get_ddl('REF_CONSTRAINT', c.constraint_name)) from user_constraints c where table_name='EX_EMPLOYEE' 
and c.constraint_type='R'
union
select to_char( dbms_metadata.get_ddl('INDEX', c.index_name)) from user_indexes c where table_name='EX_EMPLOYEE'
union
select to_char( dbms_metadata.get_ddl('PROCEDURE', d.name)) from user_dependencies d where d.referenced_name='EX_EMPLOYEE'
and d.type='PROCEDURE'
union
select to_char( dbms_metadata.get_ddl('TRIGGER', d.name)) from user_dependencies d where d.referenced_name='EX_EMPLOYEE'
and d.type='TRIGGER'
...