我的程序依赖于我的Firebird数据库中的视图。今天,我改变了视图,通过这样做,我希望解决我的程序中的错误。然后我发现(经过大约一个小时的挫折),我的程序仍在使用以前版本的视图。
这是我正在谈论的一个例子(授予,它不是一个非常真实的程序用法):
-- Create a view
create view select_one_view as select 1 as one from rdb$database;
-- Create a procedure that selects from my view
SET TERM ^ ;
create procedure select_from_view
returns (number integer) as
begin
select one from select_one_view into :number;
suspend;
end^
SET TERM ; ^
所以现在我的程序取决于视图。当我执行此过程(execute procedure select_from_view
)时,它会按预期返回1。
现在让我们改变观点:
alter view select_one_view as select 2 as one from rdb$database;
此时,我希望我的程序返回2.相反,它返回1.
作为一个完整性检查,我尝试在SQL Server中做同样的事情,但它按照我的预期工作,在我改变视图后返回2。
为什么世界上我希望这种情况发生?我是否希望手动更改依赖于我的视图的每个过程/触发器?看起来这种行为似乎只会产生未被注意的问题。
P.S。我已尝试使用版本V2.5.2.26539和V2.5.2.26540。
答案 0 :(得分:0)
可能与Firebird的文件系统缓存有关。
您可以检查以下参数:
在数据库级别:
强制写入
:
MaxUnflushedWrites
MaxUnflushedWriteTime
答案 1 :(得分:0)
这是由于元数据缓存。您可能需要断开数据库的所有附件的连接并重新连接。这适用于SuperServer模式,Classic和SuperClassic模式不跨附件共享缓存。