我想在我的 Firebird 数据库中存储一个数字,指示其结构的修订。仅当某些迁移脚本成功更改结构时,才应更新该数字。因此存储机制需要对事务敏感,这就是我不能使用生成器的原因。我考虑的替代方案是定义一个返回数字的存储过程,并在事务中更改其定义,但这似乎也能在回滚后继续存在。我有什么选择,不使用表格?
我想在我的 Firebird 数据库中存储一个数字,指示其结构的修订。仅当某些迁移脚本成功更改结构时,才应更新该数字。因此存储机制需要对事务敏感,这就是我不能使用生成器的原因。我考虑的替代方案是定义一个返回数字的存储过程,并在事务中更改其定义,但这似乎也能在回滚后继续存在。我有什么选择,不使用表格?
我认为您可以使用触发的数据库触发器
TRANSACTION COMMIT
。但是,您只需要对那些由“升级脚本”引起的提交做出反应,因此您需要设置一个标志来指示它。为此,您可以在USER_TRANSACTION
命名空间中设置上下文变量。即你的脚本看起来像这样现在数据库触发器可以检查
IncrementVersion
上下文变量并采取相应的行动这里触发器使用名为“GEN_DB_Version”的生成器(又名序列)来“存储”版本号。
如果您
COMMIT WORK
在脚本中使用语句,则必须使系统更加复杂,要么设置额外的标志以忽略脚本中间的那些提交,要么在最终提交之前设置标志,或者可能是第三种方式 - 这完全取决于你想使用什么“副作用”。尝试用户上下文变量。您可以通过
RDB$SET_CONTEXT
,RDB$GET_CONTEXT
函数访问它们。例如:将设置
SomeVar
为0
.有两个可用的命名空间:
USER_TRANSACTION
和USER_SESSION
. 我认为他们的名字不言而喻。