powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Trigger on DataBase_Restored ?
14 сообщений из 14, страница 1 из 1
Trigger on DataBase_Restored ?
    #35777684
Greenhorn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.

Код: plaintext
1.
2.
3.
select @@version
----
Microsoft SQL Server  2005  -  9 . 00 . 3050 . 00  (Intel X86)   Mar   2   2007   20 : 01 : 28    Copyright (c)  1988 - 2005  
Microsoft Corporation  Enterprise Edition on Windows NT  5 . 2  (Build  3790 : Service Pack  2 ) 
Есть ли возможность отследить завершение операции Restore DataBase для
проведения некоторых действий ?
...
Рейтинг: 0 / 0
Trigger on DataBase_Restored ?
    #35777789
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А restore database у вас само магическим образом запускается, что его отслеживать надо?
...
Рейтинг: 0 / 0
Trigger on DataBase_Restored ?
    #35777856
Greenhorn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Гавриленко Сергей Алексеевич,

Нет. Пользователями на специально выделенном для этих целей инстансе, и, что хуже,
DataProtector'ом (такая шелесяка с невменяемыми админами).

Если пользователей, с трудом, удалось убедить/заставить использовать хранимку, то с шелесякой сложнее ...

Вот и хочется странного - чтоб работало и меня не трогало ...
...
Рейтинг: 0 / 0
Trigger on DataBase_Restored ?
    #35777883
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Отследить событие завершения команды можно только в Профайлере.
Проще всего повесить job и следить за обновлением метаданных о ресторах в базе msdb
...
Рейтинг: 0 / 0
Trigger on DataBase_Restored ?
    #35777912
Greenhorn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Glory,
Жаль, что красиво не получается...
Уже так и сделал. Вот только пришлось время поменьше поставить - база уже отресторилась,
а прав на нее еще нет - вот и пристают с разными глупыми вопросам, пиво пить мешают ж-(
...
Рейтинг: 0 / 0
Trigger on DataBase_Restored ?
    #35777920
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так собственно и непонятно, что вы собираетесь делать с базой после Restore. И почему эти действия не могут быть совмещены со скриптом, который этот Restore запускает
...
Рейтинг: 0 / 0
Trigger on DataBase_Restored ?
    #35777984
Greenhorn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
GloryТак собственно и непонятно, что вы собираетесь делать с базой после Restore. И почему эти действия не могут быть совмещены со скриптом, который этот Restore запускает

Дело в том, что базы, которые ресторятся, хранятся на лентах и по запросу этих самых пользователей восстанавливаются на отдельный инстанс.
Беда в том, что есть базы, совсем древние, у которых полная каша с правами к ним.
Чать пользователей присутствуют и в этих базах, а часть нет. Вот и приходится после восстановления баз права раздавать, согласно текущему составу пользователей.
Если Restore идет через SP, то проблем нет.
Но часть баз, причем самая старая, backup'илась DataProtect'ором и может быть восстановлена только им напрямую в SQL (как утверждают админы этой зверушки).
Уж больно нехочется sysadmin'ами всех делать, даже на отдельном инстансе...
...
Рейтинг: 0 / 0
Trigger on DataBase_Restored ?
    #35780205
mike909
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Greenhorn,

По данному вопросу в Гугле могучая куча ссылок.
И единственное нормальное решение там, то к которому Вы уже пришли.

Но!

Хочу предложить еще один способ мониторинга завершения команды Restore, который вполне годится и в других подобных случаях.

Итак.
Делаем все как в BOL -> CREATE EVENT NOTIFICATION для события EVENTLOG.
В reader'е вставляем следующий код
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
    if (@Err =  0 ) and (@MsgType = 'http://schemas.microsoft.com/SQL/Notifications/EventNotification')
        and @MsgBody is not NULL -- Это, впрочем, лишняя проверка
    begin
      if @MsgBody.value('(/EVENT_INSTANCE/Error)[1]','int') =  18267 
      begin
        set @DbName = @MsgBody.value('(/EVENT_INSTANCE/TextData)[1]','sysname');
        set @DbName = LTrim(SUBSTRING(@DbName, charindex('Database: ', @DbName)+  10 ,  1024  ));
        set @DbName = Left(@DbName, charindex(',', @DbName) - 1  )

        /*****************************
           Выполняем все что хотели над свежевосстановленной базой. Имя базы в @DbName
        *****************************/
      end;
    end;

Это не конечный вариант. Работает с language_id = 1033. Для остальных language_id см. в сторону sys.messages where message_id = 18267
...
Рейтинг: 0 / 0
Trigger on DataBase_Restored ?
    #35780709
Greenhorn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mike909,

Огромное спасибо - работает !!!
Это действительно то, что нужно. И довольно красиво получилось.

Вот только смущает
--CUT BOL --
Некоторые ошибки могут привести к досрочному завершению диалогов. Явное завершение всех или некоторых диалогов может помешать конечной службе получать новые сообщения.
-- END CUT --

Т.е. Если чего-то не срастется, то я узнаю об этом только когда пользователи заарут ?
А есть ли еще какие подводные камни ?
А нет ли у кого функции по выдиранию значений параметров на основе шаблона из sys.messages
Т.е. имеем сообщение типа
Код: plaintext
Database was restored: Database: Test, creation date(time):  2008 / 11 / 25 ( 15 : 28 : 11 ), first LSN:  20 : 760 : 37 , last LSN:  20 : 776 : 1 , number of dump devices:  1 , device information: (FILE= 1 , TYPE=DISK: {'G:\Temp\Test.bak'}). Informational message. No user action required.
и шаблон из sys.messages
Код: plaintext
Database was restored: Database: %s, creation date(time): %s(%s), first LSN: %s, last LSN: %s, number of dump devices: %d, device information: (%s). Informational message. No user action required.

Для сообщения указанного выше хочу получить что то типа
Код: plaintext
1.
2.
3.
select dbo.GetValueFromMsg( 18267 ,  1 , @MessageText), dbo.GetValueFromMsg( 18267 ,  2 , @MessageText)
---
test,  2008 / 11 / 25 
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Trigger on DataBase_Restored ?
    #40087870
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Знаю что сам вопрос стар, но просто чтобы сохранился в поиске еще один способ решения подобных вопросов, процитирую ответ с форума мелкомягких :

This is how I solved this problem. I can tell you it does work. A trigger on restorehistory will not work.

You can create an alert that executes a job on a successful restore event. You will need to create the Job and put in the job ID if you run this script.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
USE [msdb]
GO

/****** Object:  Alert [Restore Success Database - 18267]    Script Date: 1/19/2017 3:28:44 PM ******/
EXEC msdb.dbo.sp_add_alert @name=N'Restore Success Database - 18267', 
@message_id=18267, 
@severity=0, 
@enabled=1, 
@delay_between_responses=60, 
@include_event_description_in=1, 
@category_name=N'[Uncategorized]', 
@job_id=
GO



Далее все необходимое делаем в запускающемся Job-e.

PS
Понятно что для удобства можно использовать параметр не @job_id, а @job_name
...
Рейтинг: 0 / 0
Trigger on DataBase_Restored ?
    #40088147
newbie876454
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо. Интересный вариант. Но нужно держать запущенным SQL Agent.
В свое время тоже заморачивался детектом этого события, а заставить работать NOTIFICATION долго не удавалось, потом лезли какие-то непонятные глюки в error логе.
Вот бы ваше сообщение на пару лет раньше прочесть.
...
Рейтинг: 0 / 0
Trigger on DataBase_Restored ?
    #40088243
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
newbie876454
Спасибо. Интересный вариант. Но нужно держать запущенным SQL Agent.
В свое время тоже заморачивался детектом этого события, а заставить работать NOTIFICATION долго не удавалось, потом лезли какие-то непонятные глюки в error логе.
Вот бы ваше сообщение на пару лет раньше прочесть.


Это хорошо для серверов, которые поддерживают Агентов. А если их нет, то вопрос остается.
...
Рейтинг: 0 / 0
Trigger on DataBase_Restored ?
    #40088255
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин,

Alert срабатывает по event, соответственно, можно написать перехватчик события.
К примеру, вот что пишут наши индийские друзья:
https://www.mssqltips.com/sqlservertip/4256/sql-server-2016-extended-events-detailed-backup-information/
...
Рейтинг: 0 / 0
Trigger on DataBase_Restored ?
    #40088582
AndrF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
newbie876454
Спасибо. Интересный вариант. Но нужно держать запущенным SQL Agent.


У нас он по определению везде запущен - базы-то обслуживать надо, да и пользовательские Job-ы...

newbie876454

В свое время тоже заморачивался детектом этого события, а заставить работать NOTIFICATION долго не удавалось, потом лезли какие-то непонятные глюки в error логе.
Вот бы ваше сообщение на пару лет раньше прочесть.


Да, тут реализация попроще и понятней. Хотя, если есть желание, то можно и через NOTIFICATION заморочиться. Но меня, в данном случае, вполне устроило то что попроще.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Trigger on DataBase_Restored ?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]