2012-08-24 33 views
5

Tôi đang cố gắng xây dựng một tập lệnh Firebird để đảm bảo rằng một chỉ mục nhất định tồn tại và được tạo chính xác. Sau một chút của Googling xung quanh, tôi đã nhận những gì có vẻ là cú pháp đúng:Làm cách nào để tạo tập lệnh chỉ mục có thể lặp lại?

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

Điều này sẽ chạy một lần, và nó hoạt động tốt. Nhưng nếu tôi cố gắng chạy nó lần thứ hai, tôi nhận được lỗi "chỉ mục đã tồn tại", cho biết phần execute statement không thực sự chạy.

Tôi đang thiếu gì? Làm cách nào để làm cho tập lệnh này hoạt động đúng?

Trả lời

7

Sử dụng với điều khoản tự động. Mã sau hoạt động cho tôi:

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

Cảm ơn. Điều đó hiệu quả. –

5

Bạn đã cam kết giao dịch chưa?

Hầu hết các cơ sở dữ liệu quan hệ chạy trong một giao dịch theo mặc định. Cho đến khi bạn commit hoặc rollback giao dịch đang chờ xử lý. Bạn cần phải

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' 
Các vấn đề liên quan