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

时间:2018-02-23 08:23:39

标签: sql-server sql-server-2012

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

它会对系统表和sysobjects等视图进行多次后续查询。

有时,数据同步过程会同时运行,从而创建表和索引。

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

  1. 应用程序读取表和列列表。
  2. 数据同步过程创建新表和索引。
  3. 应用程序读取索引列表,新索引用于“不存在”表。
  4. 重现此内容的简单示例。

    在第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锁定?

    在具有可序列化隔离级别的事务中运行元数据查询无济于事。

1 个答案:

答案 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