我的应用程序需要缓存SQL Server元数据(表,列,索引等)。
它会对系统表和sysobjects
等视图进行多次后续查询。
有时,数据同步过程会同时运行,从而创建表和索引。
在这种情况下,查询的元数据变得不一致:
重现此内容的简单示例。
在第1节:
-- 0. Drop example table if exists
if object_id('test') is not null drop table test
-- 1. Query tables (nothing returned)
select * from sysobjects where name = 'test'
-- 3. Query indexes (index returned for the new table)
select IndexName = x.name, TableName = o.name
from sysobjects o join sysindexes x on x.id = o.id
where o.name = 'test'
在第2节:
-- 2. Create table with index
create table test (id int primary key)
有没有办法让元数据查询保持一致,比如整个数据库或数据库架构上的Schema Modification锁定?
在具有可序列化隔离级别的事务中运行元数据查询无济于事。
答案 0 :(得分:0)
您可以“模拟”与sysobjects(表)的临时表的一致性,然后使用此临时表来查询属于该表的索引。 像这样:
if object_id('tempdb..#tempTables') is not null
drop table #tempTables;
select
*
into #tempTables
from sys.objects as o
where o.type = 'U'
select
*
from #tempTables t
select
i.*
from #tempTables t
inner join sys.indexes as i on t.object_id = i.object_id