sql - without - DROP und CREATE Index gleichzeitig



sql developer ubuntu (1)

Der Name des Tabellenbesitzers und der Name des Indexbesitzers stimmen nicht überein. Wir müssen den Index sowie die damit verbundenen Einschränkungen löschen und dieselben in dem bestimmten Schema neu erstellen, um den Namen des Indexbesitzers und des Tabellenbesitzers zu berücksichtigen. Wir haben eine unterschiedliche Anzahl an Spalten für jeden Index, der von 1 bis 4 variiert. Ich muss eine Prozedur erstellen, mit der gleichzeitig keine Neuerstellung abgebrochen werden kann.

declare
total number(10);
table_name varchar2(255);
index_name varchar2(255);
column_name varchar2(255);
begin
select  a.table_name, a.index_name,count(a.column_name) into table_name, index_name,total
from all_ind_columns a, all_indexes b where a.index_name = b.index_name
and b.table_owner = 'SIM'and b.owner like 'TIM'
group by a.table_name,a.index_name
order by a.table_name,a.index_name,count(a.column_name);
select c.column_name into column_name from all_ind_columns c,all_indexes d 
where c.index_name=d.index_name 
and d.table_owner='SIM' and d.owner like 'TIM';
for i in (select  a.table_name, a.index_name,count(a.column_name) from all_ind_columns a, all_indexes b where a.index_name = b.index_name
and b.table_owner = 'SIM'and b.owner like 'TIM'
group by a.table_name,a.index_name
order by a.table_name,a.index_name,count(a.column_name))
loop
If i.count(a.column_name)=1 then
DBMS_OUTPUT.PUT_LINE ('Create index'||index_name|| 'on' ||table_name||'('||Column_name||')');
else total>=2
then
DBMS_OUTPUT.PUT_LINE ('Create index'||index_name|| 'on' ||table_name||'('||Column_name,Column_name||')');
end if;
end loop;
end;

DBMS_METADATA ist die offizielle Methode, um Objekt-DDL neu zu generieren . Dies ist normalerweise besser als das manuelle Erstellen von DDL-Anweisungen. Es gibt Hunderte von Optionen zum Erstellen von Indizes. DBMS_METADATA.GET_DDL ist die einzige Möglichkeit, um sicherzustellen, dass Sie das Objekt genau neu erstellen.

declare
    v_index_ddl clob;
begin
    for indexes_in_wrong_schema in
    (
        select table_name, index_name
        from all_indexes
        where table_owner = 'SIM' and owner like 'TIM'
    ) loop
        v_index_ddl := dbms_metadata.get_ddl('INDEX', 
            indexes_in_wrong_schema.index_name, 'TIM');
        --Or replace these with "execute immediate" to run instead of print.
        dbms_output.put_line('drop index TIM.'||
            indexes_in_wrong_schema.index_name);
        dbms_output.put_line(replace(v_index_ddl, '"TIM"', '"SIM"'));
    end loop;
end;
/

Privilegien

DBMS_METADATA erfordert, dass Sie entweder über SELECT_CATALOG_ROLE oder als SELECT_CATALOG_ROLE ausgeführt werden. Fragen Sie einen DBA oder einen anderen privilegierten Benutzer, ob er Ihnen diese Rolle gewähren kann. Oder konvertieren Sie den obigen PL / SQL-Block in eine Funktion, installieren Sie die Funktion im Schema des Eigentümers und grant execute on new_function to your_user; .





oracle11g