2012-08-24 12 views
5

Estoy intentando crear un script de Firebird que garantice que exista cierto índice y se cree correctamente. Después de un poco de google alrededor, tengo lo que parece ser la sintaxis correcta:¿Cómo puedo hacer un script de índice repetible?

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); 

Esto ejecutará una vez, y funciona bien. Pero si intento ejecutarlo por segunda vez, aparece el error "el índice ya existe", que indica que la parte execute statement no se está ejecutando realmente.

¿Qué me estoy perdiendo? ¿Cómo hago que este script funcione correctamente?

Respuesta

7

Uso CON AUTÓNOMA cláusula TRANSACCIÓN. El siguiente código funciona para mí:

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

Thanks. Eso funciono. –

5

¿Ha cometido la transacción?

La mayoría de las bases de datos relacionales se ejecutan en una transacción de manera predeterminada. Hasta que commit o rollback la transacción esté pendiente. Es necesario que

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' 
Cuestiones relacionadas