2012-08-24 35 views
5

我正在嘗試構建一個Firebird腳本,以確保某個索引存在並正確創建。經過一番Google搜索後,我得到了什麼似乎是正確的語法:如何製作可重複的索引腳本?

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

這將運行一次,它工作正常。但是,如果我嘗試第二次運行它,則會出現「索引已存在」錯誤,這表示execute statement部分實際上並未運行。

我錯過了什麼?我如何使這個腳本正常工作?

回答

7

使用與自治事務條款。以下代碼適用於我:

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

謝謝。這工作。 –

5

你有沒有承諾的交易?

大多數關係數據庫默認運行在事務中。直到您commitrollback交易處於待處理狀態。您需要

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'