#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
значения в течение этого периода.