2012-08-24 11 views
5

Próbuję zbudować skrypt Firebird, który zapewni istnienie pewnego indeksu i zostanie utworzony poprawnie. Po trochę Googling, dostałem to, co wydaje się być prawidłowa składnia:Jak utworzyć powtarzalny skrypt indeksu?

To będzie działać raz, i działa dobrze. Ale jeśli spróbuję uruchomić go po raz drugi, pojawia się błąd "już istnieje indeks", który wskazuje, że część execute statement nie działa.

Czego mi brakuje? Jak sprawić, by ten skrypt działał poprawnie?

Odpowiedz

7

Korzystanie autonomiczne TRANSAKCJI klauzuli. Poniższy kod działa dla mnie:

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

Dzięki. To się udało. –

5

Czy dokonałeś transakcji ?

Większość relacyjnych baz danych działa domyślnie w transakcji. Do czasu, gdy transakcja oczekuje na commit lub rollback. Trzeba

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' 
Powiązane problemy