Пропускать определенную базу данных в определенные часы

#sql-server #database #skip #hour

Вопрос:

Я использовать T-SQL скриптов для мониторинга сервера SQL.
Для той, которая проверить, если база данных в интернете, у меня такая проблема : каждую ночь, я восстанавливаю сейчас в одной базе данных, поэтому я получаю предупреждение с 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'
 

Я все еще могу видеть свою базу данных не в Сети.

Я не далек от решения, но я в тупике.
Кто-нибудь может оказать мне некоторую помощь, пожалуйста ?
Заранее спасибо.

Комментарии:

1. В чем заключалась идея WHERE state_desc <> 'ONLINE' OR state_desc <> 'ONLINE' ?

2. Вся часть заключается OR state_desc <> 'ONLINE' AND DATEPART (HOUR, GETDATE ()) = 04 AND DATEPART (MINUTE, GETDATE ()) BETWEEN 05 AND 15 AND name <> 'TEST' в том, и идея состоит в том, чтобы не показывать все базы данных, кроме тестовой базы данных

3. @Thalyn SQL Server на самом деле не соблюдает порядок операций, как это было бы на других языках, поэтому вы всегда должны заключать дополнительные критерии в круглые скобки, как указано в моем ответе ниже

Ответ №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 значение, не ONLINE относящееся к периоду за пределами 04:05 to 04:15 , но только те, в которых нет name TEST значения в течение этого периода.