如何对SQL Server元数据进行一致的查询



我的应用程序需要缓存SQL Server元数据(表,列,索引等(。

它对系统表和诸如 sysobjects之类的视图进行了几个后续查询。

有时数据同步过程同时运行以创建表和索引。

在这种情况下,查询元数据变得不一致:

  1. 应用程序读取表和列列表。
  2. 数据同步过程创建了新的表和索引。
  3. 应用程序读取索引列表,新索引用于"不存在"表。

一个简单的复制示例。

在会议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)

是否有一种方法可以使元数据查询保持一致,类似于整个数据库或数据库架构上的架构修改锁?

以可序列化隔离级别的交易中运行元数据查询无济于事。

您可以"模拟"与sysobjects(表(的temp Table的一致性,然后使用此临时表查询属于该表的索引。这样:

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

相关内容

  • 没有找到相关文章

最新更新