5

特定のインデックスが存在し、正しく作成されることを保証するFirebirdスクリプトを作成しようとしています。少しグーグルした後、正しい構文と思われるものが得られました。

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

これは1回実行され、正常に機能します。しかし、もう一度実行しようとすると、「インデックスはすでに存在します」というエラーが表示されます。これは、execute statementパーツが実際に実行されていないことを示しています。

私は何が欠けていますか?このスクリプトを正しく機能させるにはどうすればよいですか?

4

2 に答える 2

7

WITH AUTONOMOUS TRANSACTION句を使用します。次のコードは私にとってはうまくいきます:

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
于 2012-08-25T12:31:46.653 に答える
5

トランザクションをコミットしましたか?

ほとんどのリレーショナル データベースは、デフォルトでトランザクションで実行されます。あなたcommitまたはrollbackトランザクションが保留中になるまで。必要がある

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'
于 2012-08-24T23:59:04.240 に答える