【问题标题】:asp.net core api healthcheckasp.net 核心 API 健康检查
【发布时间】:2021-01-08 02:06:00
【问题描述】:

我正在向我的 netcore 网站添加一些健康检查。其中之一是检查连接字符串是否指向已激活内存表支持的数据库(主要是如果文件组是使用 CONTAINS MEMORY_OPTIMIZED_DATA 标志创建的)。

健康检查可以使用这个查询:

IF((SELECT COUNT(1) FROM sys.filegroups FG
JOIN sys.database_files DF
ON FG.data_space_id = DF.data_space_id
JOIN sys.master_files MF
ON DF.file_id = MF.file_id
JOIN sys.databases DB
ON DB.database_id = MF.database_id
where FG.type = 'FX'
and DB.name ='MyDB')>0)
BEGIN
SELECT 1
END
ELSE
BEGIN
RAISERROR ('Memory file group not set',  
18, -- Severity,  
-1); -- State);
END

并通过以下方式注册:

.AddSqlServer(connectionString: connString,
    healthQuery: myHealthQuery, name: HealthCheckNames.InMemoryState)

查询确实返回 1,没有任何错误。我已经设置了一个分析器来运行它,并且没有抛出任何错误(我可以看到 Select 1 正在返回)。

不过,该运行状况检查返回不正常。

知道为什么吗?

【问题讨论】:

    标签: asp.net-core health-check


    【解决方案1】:

    原来是权限问题。连接字符串的用户缺少我不愿意分配的权限(查看任何定义)。

    我通过跳过连接到 sys.master_files 表并使用 like 运算符解决了这个问题

    IF((SELECT Count(1) FROM sys.filegroups FG
    JOIN sys.database_files DF
    ON FG.data_space_id = DF.data_space_id
    where FG.type = 'FX'
    and Df.name  LIKE 'MyDB%') > 0)
    BEGIN
        SELECT 1
    END
    ELSE
    BEGIN
        RAISERROR ('Memory file group not set',  
            18, -- Severity,  
            -1); -- State);
    END
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-24
      • 2017-06-09
      • 2014-10-02
      • 2021-09-13
      • 2019-11-03
      • 1970-01-01
      相关资源
      最近更新 更多