Firebird
在 Firebird 中儲存事務敏感常量
我想在我的 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
在腳本中使用語句,則必須使系統更加複雜,要麼設置額外的標誌以忽略腳本中間的那些送出,要麼在最終送出之前設置標誌,或者可能是第三種方式 - 這一切都取決於你想使用什麼“副作用”。