从Advantage迁移至PostgreSQL后,FireDAC能否访问临时表索引?
问题背景与现象
我们正将数据库从Advantage Database迁移至PostgreSQL,此前在Advantage中的临时表操作模式如下:
TRY DROP TABLE #TemporaryTable; CATCH ALL END TRY; SELECT Field1, Field2 INTO #TemporaryTable FROM MainTable WHERE Type=1; CREATE INDEX FirstIndex ON #TemporaryTable (Field2);
通过TAdsQuery执行ExecSQL后,用TAdsTable打开#TemporaryTable,可直接设置IndexName为"FirstIndex",设计时下拉列表也能显示所有索引。
迁移到PostgreSQL后,改用TFDQuery执行以下逻辑:
DROP TABLE IF EXISTS TemporaryTable; SELECT Field1, Field2 INTO TEMP TemporaryTable FROM MainTable WHERE Type=1; CREATE INDEX FirstIndex ON TemporaryTable (Field2);
通过以下SQL可确认索引确实存在:
SELECT indexname, indexdef FROM pg_indexes
但TFDTable在设计时和运行时均无法识别这些索引。虽可使用IndexFieldNames替代,但UI其他模块依赖预定义的特定索引列表实现功能,因此需要解决TFDTable对临时表索引的识别问题。
解决方案
显式指定临时表的模式
PostgreSQL临时表默认归属pg_temp模式,FireDAC默认可能不会扫描该模式的元数据。可以显式指定模式创建临时表:DROP TABLE IF EXISTS pg_temp.TemporaryTable; SELECT Field1, Field2 INTO pg_temp.TemporaryTable FROM MainTable WHERE Type=1; CREATE INDEX FirstIndex ON pg_temp.TemporaryTable (Field2);之后在TFDTable的
TableName属性中填写pg_temp.TemporaryTable,FireDAC即可正确读取该表的索引信息。手动刷新FireDAC元数据
- 运行时:关闭TFDTable后调用
RefreshMetaData方法强制刷新元数据,再重新打开表:FFDTable.Close; FFDTable.TableName := 'TemporaryTable'; FFDTable.RefreshMetaData; FFDTable.Open; - 设计时:右键点击TFDTable组件,选择"Refresh"选项,手动触发元数据刷新,即可在
IndexName下拉列表中看到对应索引。
- 运行时:关闭TFDTable后调用
UI层索引映射兼容
如果上述方法无法解决问题,可保留使用IndexFieldNames,同时在UI层建立索引名称映射表,将原依赖的预定义索引名称(如"FirstIndex")对应到对应的字段列表(如"Field2"),确保原有功能逻辑无需大幅修改。
内容的提问来源于stack exchange,提问作者FLDelphi
相关产品推荐
相关产品推荐

