【问题标题】:Skip specific database during specific hours在特定时间跳过特定数据库
【发布时间】:2021-07-28 10:47:08
【问题描述】:

我使用 T-SQL 脚本来监控 SQL Server。
对于检查数据库是否在线的那个,我有一个问题:每天晚上,我现在恢复一个数据库,所以我在 04:05 到 04:15 之间收到警报。
我想修改我的脚本,以便在 24 小时内检查所有数据库,但在我恢复它的时候除外。

这是我检查数据库是否不在线的查询:

SELECT name
FROM master.sys.databases
WHERE state_desc <> 'ONLINE'

当我尝试这样做时:

SELECT name
FROM master.sys.databases
WHERE state_desc <> 'ONLINE'
AND DATEPART (HOUR, GETDATE ()) = 04
AND DATEPART (MINUTE, GETDATE ()) BETWEEN 05 AND 15
AND name <> 'TEST'

其他时间我都瞎了。

然后:

SELECT name
FROM master.sys.databases
WHERE state_desc <> 'ONLINE'
OR state_desc <> 'ONLINE'
AND DATEPART (HOUR, GETDATE ()) = 04
AND DATEPART (MINUTE, GETDATE ()) BETWEEN 05 AND 15
AND name <> 'TEST'

我仍然可以看到我的数据库不在线。

我离解决方案不远,但我被困住了。
有人可以帮帮我吗?
提前致谢。

【问题讨论】:

  • WHERE state_desc &lt;&gt; 'ONLINE' OR state_desc &lt;&gt; 'ONLINE' 背后的想法是什么?
  • 整个部分是OR state_desc &lt;&gt; 'ONLINE' AND DATEPART (HOUR, GETDATE ()) = 04 AND DATEPART (MINUTE, GETDATE ()) BETWEEN 05 AND 15 AND name &lt;&gt; 'TEST',目的是避免显示除TEST数据库之外的所有数据库
  • @Thalyn SQL Server 并不像其他语言那样真正尊重操作顺序,因此您应该始终将补充标准包含在括号内,根据我在下面的回答

标签: sql-server database skip hour


【解决方案1】:

您只需要在您的 where 子句中更具体一点,以确保您正在应用您想要的标准:

select [name]
from master.sys.databases
where state_desc <> 'ONLINE'    -- Only return the database when it is not online
    and ([name] <> 'TEST'       -- when either it isn't the TEST database
         or (cast(getdate() as time) < '04:05'      -- or we are outside the TEST
             or cast(getdate() as time) >= '04:15'  -- database restore window
            )
        )

这将做的是返回所有具有state_desc 的数据库在04:05 之外的时间段内不是ONLINE04:15,但只返回那些没有name 的数据库TEST 在这段时间内。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-25
    • 2014-08-11
    相关资源
    最近更新 更多