Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помогите доработать запрос MSSQL  [new]
Mayro
Member

Откуда:
Сообщений: 3
Добрый день, Коллеги!

Есть такой запрос (см. ниже), который показывает когда последний раз входили в базы (last_user_read), вносили изменения (last_user_update) и дату создания базы (db_create_date).

Подскажите как изменить запрос чтобы он отображал только те базы, которые в названии содержат слово "accounting" и в которые не заходили более 5 дней?


SELECT 
  DB_NAME(db.database_id) DatabaseName, 
  MAX(CASE WHEN ISNULL(s.last_user_seek, '1900-01-01') > ISNULL(s.last_user_scan, '1900-01-01') 
      THEN 
        CASE WHEN ISNULL(s.last_user_seek, '1900-01-01') > ISNULL(s.last_user_lookup, '1900-01-01') 
        THEN 
          s.last_user_seek
        ELSE
          s.last_user_lookup
        END
      ELSE 
        CASE WHEN ISNULL(s.last_user_scan, '1900-01-01') > ISNULL(s.last_user_lookup, '1900-01-01') 
        THEN 
          s.last_user_scan
        ELSE
          s.last_user_lookup
        END          
      END) AS last_user_read,
  MAX(last_user_update) AS last_user_update,
  db.create_date AS db_create_date
FROM sys.databases db
  LEFT JOIN sys.dm_db_index_usage_stats AS s ON s.database_id = db.database_id
GROUP BY DB_NAME(db.database_id), db.create_date
ORDER BY last_user_read, last_user_update
26 июл 19, 17:48    [21935652]     Ответить | Цитировать Сообщить модератору
 Re: Помогите доработать запрос MSSQL  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36501
Трехэтажный кейс для получения максимального значения просто великолепен.

SELECT 
    DB_NAME(db.database_id) DatabaseName, 
    max (last_user_read) as last_user_read, 
    MAX(last_user_update) AS last_user_update,
    db.create_date AS db_create_date
FROM sys.databases db
LEFT JOIN sys.dm_db_index_usage_stats AS s ON s.database_id = db.database_id
outer apply (
    select
        last_user_read = max ( isnull (s.last_user_read, '19000101' ) )
    from (
                  select s.last_user_seek
        union all select s.last_user_lookup
        union all select s.last_user_scan
    ) s ( last_user_read )    
) r
GROUP BY DB_NAME(db.database_id), db.create_date
having ( DB_NAME(db.database_id) like '%accounting%' and datediff ( dd, max (last_user_read), getdate() ) > 5 )
ORDER BY last_user_read, last_user_update
26 июл 19, 18:50    [21935701]     Ответить | Цитировать Сообщить модератору
 Re: Помогите доработать запрос MSSQL  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36501
А, да, в sys.databases есть поле name, если что.
26 июл 19, 18:51    [21935702]     Ответить | Цитировать Сообщить модератору
 Re: Помогите доработать запрос MSSQL  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 6954
Гавриленко Сергей Алексеевич,

old school :) Новое поколение выбирает values :)
26 июл 19, 20:51    [21935767]     Ответить | Цитировать Сообщить модератору
 Re: Помогите доработать запрос MSSQL  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36501
Владислав Колосов,

У меня от скобок в глазах рябит :-/
26 июл 19, 23:07    [21935816]     Ответить | Цитировать Сообщить модератору
 Re: Помогите доработать запрос MSSQL  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 6954
Гавриленко Сергей Алексеевич,

В данном запросе, к счастью, всё довольно эстетично, но согласен, порой скобок много:

SELECT 
    DB_NAME(db.database_id) DatabaseName, 
    max (last_user_read) as last_user_read, 
    MAX(last_user_update) AS last_user_update,
    db.create_date AS db_create_date
FROM sys.databases db
LEFT JOIN sys.dm_db_index_usage_stats AS s ON s.database_id = db.database_id
outer apply (
    select
        last_user_read = max ( isnull (s.last_user_read, '19000101' ) )
    from (values (s.last_user_seek),
                 (s.last_user_lookup),
                 (s.last_user_scan)
	 ) s ( last_user_read )    
) r
GROUP BY DB_NAME(db.database_id), db.create_date
having ( /*DB_NAME(db.database_id) like '%accounting%' and*/ datediff ( dd, max (last_user_read), getdate() ) > 5 )
ORDER BY last_user_read, last_user_update
26 июл 19, 23:19    [21935823]     Ответить | Цитировать Сообщить модератору
 Re: Помогите доработать запрос MSSQL  [new]
Mayro
Member

Откуда:
Сообщений: 3
Гавриленко Сергей Алексеевич,
Владислав Колосов,

Большое спасибо за помощь! Скрипт работает!
29 июл 19, 09:18    [21936584]     Ответить | Цитировать Сообщить модератору
 Re: Помогите доработать запрос MSSQL  [new]
Mayro
Member

Откуда:
Сообщений: 3
Добрый день, Коллеги.

Что-то скрипт поработал некоторое время и перестал, показывает что в базы никто не заходил, хотя это не так.
Что это может быть? Откуда скрипт берёт информацию о последнем изменении базы?
Все базы показывают "last_user_read 1900-01-01 00:00:00.000" "last_user_update NULL"
вчера, 17:31    [22016468]     Ответить | Цитировать Сообщить модератору
 Re: Помогите доработать запрос MSSQL  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36501
Mayro,

После рестарта сервера/базы даты сбрасываются.
вчера, 17:48    [22016485]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить