Firebird

在 Firebird 中儲存事務敏感常量

  • March 19, 2013

我想在我的 Firebird 數據庫中儲存一個數字,指示其結構的修訂。僅當結構已被某些遷移腳本成功更改時,才應該更新該數字。因此儲存機制需要對事務敏感,這就是我不能使用生成器的原因。我考慮的替代方案是定義一個返回數字的儲存過程,並在事務中更改其定義,但這似乎也能在回滾中倖存下來。我有什麼選擇,不使用桌子?

我認為您可以使用在TRANSACTION COMMIT. 但是,您只需要對由“升級腳本”引起的送出做出反應,因此您需要設置一個標誌來指示它。為此,您可以在USER_TRANSACTION命名空間中設置上下文變數。即你的腳本看起來像這樣

RDB$SET_CONTEXT('USER_TRANSACTION', 'IncrementVersion', 1);
-- other statements
...
-- in the end of the script commit
COMMIT WORK;

現在數據庫觸發器可以檢查IncrementVersion上下文變數並採取相應的行動

CREATE TRIGGER IncrementDBVersion
ACTIVE ON TRANSACTION COMMIT
AS
BEGIN
 IF(RDB$GET_CONTEXT('USER_TRANSACTION', 'IncrementVersion') IS NOT NULL)THEN BEGIN
    -- increment the version number
    GEN_ID(GEN_DB_Version, 1);
    -- just in case clear the context variable
    RDB$SET_CONTEXT('USER_TRANSACTION', 'IncrementVersion', NULL);
 END
END

這裡觸發器使用名為“GEN_DB_Version”的生成器(又名序列)來“儲存”版本號。

如果您COMMIT WORK在腳本中使用語句,則必須使系統更加複雜,要麼設置額外的標誌以忽略腳本中間的那些送出,要麼在最終送出之前設置標誌,或者可能是第三種方式 - 這一切都取決於你想使用什麼“副作用”。

引用自:https://dba.stackexchange.com/questions/37004