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

declare
  vSQL varchar2(2000);
  vi number;
begin
  vi := 1;
for c in (
select a.table_name, a.column_name, b.table_name pk_table
  from user_tab_columns a,
       user_constraints b,
       user_ind_columns c
  where (a.column_name like 'KD_%' or (a.column_name like 'ID_%' and a.column_name!='ID_USR'))
    and not exists (select 1 from user_constraints b1, user_ind_columns c1
                      where b1.table_name=a.table_name and b1.constraint_type='P' and c1.index_name=b1.index_name
                        and c1.column_name=a.column_name)
    and b.constraint_type='P' and b.table_name!=a.table_name and b.index_name=c.index_name
    and c.column_name = a.column_name) loop
    begin
      vSQL:='create index '||c.table_name||'_i'||to_char(vi)||' on '||c.table_name||' ('||c.column_name||')';
      execute immediate vSQL;
      vi:=vi+1;
    exception
      when others then
        null;
    end;
    begin
      vSQL:='alter table '||c.table_name||' add constraint '||c.table_name||'_fk'||to_char(vi)||' foreign key ('||c.column_name||') '||
            'references '||c.pk_table||' ('||c.column_name||')';
      execute immediate vSQL;
      vi:=vi+1;
    exception
      when others then
        dbms_output.put_line(c.table_name||c.column_name);
        dbms_output.put_line(vSQL);
    end;
end loop;
end;

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.

%d bloggers like this: