2012-08-24 16 views
5

Sto provando a creare uno script di Firebird che garantisca che un determinato indice esista e venga creato correttamente. Dopo un po 'di Googling in giro, ho ottenuto quello che sembra essere la giusta sintassi:Come si crea uno script indice ripetibile?

SET TERM^; 
execute block as begin 
IF (EXISTS(SELECT RDB$INDEX_NAME 
    FROM RDB$INDICES 
WHERE RDB$RELATION_NAME='TABLE_NAME' 
and RDB$INDEX_NAME = 'INDEX_NAME')) THEN 
execute statement 'drop index INDEX_NAME'; 
end 
SET TERM ;^

CREATE UNIQUE INDEX INDEX_NAME 
    ON TABLE_NAME 
    (FIELD1, FIELD2, FIELD3); 

Questo sarà eseguito una volta, e funziona benissimo. Ma se provo a eseguirlo una seconda volta, visualizzo un errore "l'indice esiste già", che indica che la parte execute statement non è effettivamente in esecuzione.

Cosa mi manca? Come faccio a far funzionare bene questo script?

risposta

7

Usa CON AUTONOMA clausola TRANSAZIONE. Il seguente codice funziona per me:

EXECUTE BLOCK 
AS BEGIN 
    IF (EXISTS(SELECT RDB$INDEX_NAME FROM RDB$INDICES 
    WHERE RDB$RELATION_NAME = '<relation_name>' 
     AND RDB$INDEX_NAME = '<index_name>')) THEN 
    BEGIN 
    EXECUTE STATEMENT 'drop index <index_name>' 
     with autonomous transaction; 
    END 

    EXECUTE STATEMENT 'create index <index_name> on ...' 
    with autonomous transaction; 
END 
+0

Grazie. Ha funzionato. –

5

Hai commesso la transazione?

La maggior parte dei database relazionali viene eseguita in una transazione per impostazione predefinita. Fino al commit o rollback la transazione è in sospeso. È necessario

drop index foo 

commit -- some implementations use 'commit work' others 'commit transaction' 

create index foo on bar (col_1 , ... , col_n) 

commit -- some implementations use 'commit work' others 'commit transaction' 
Problemi correlati