我有一个依赖于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版本。
也许与Firebird的文件系统缓存有关。
您可以检查此参数:
在数据库级别:强制写入
在firebird.conf中:MaxUnflushedWritesMaxUnflushedWriteTime
这是由于元数据缓存。您可能需要断开数据库的所有附件并重新连接。这适用于SuperServer模式,Classic和SuperClassic模式不跨附件共享缓存。