Trigger on DataBase_Restored ?

Greenhorn
Дата: 26.01.2009 14:50:28
Добрый день.

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 для
проведения некоторых действий ?
Гавриленко Сергей Алексеевич
Дата: 26.01.2009 15:16:29
А restore database у вас само магическим образом запускается, что его отслеживать надо?
Greenhorn
Дата: 26.01.2009 15:44:57
Гавриленко Сергей Алексеевич,

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

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

Вот и хочется странного - чтоб работало и меня не трогало ...
Glory
Дата: 26.01.2009 15:53:54
Отследить событие завершения команды можно только в Профайлере.
Проще всего повесить job и следить за обновлением метаданных о ресторах в базе msdb
Greenhorn
Дата: 26.01.2009 16:05:04
Glory,
Жаль, что красиво не получается...
Уже так и сделал. Вот только пришлось время поменьше поставить - база уже отресторилась,
а прав на нее еще нет - вот и пристают с разными глупыми вопросам, пиво пить мешают ж-(
Glory
Дата: 26.01.2009 16:07:35
Так собственно и непонятно, что вы собираетесь делать с базой после Restore. И почему эти действия не могут быть совмещены со скриптом, который этот Restore запускает
Greenhorn
Дата: 26.01.2009 16:28:04
Glory
Так собственно и непонятно, что вы собираетесь делать с базой после Restore. И почему эти действия не могут быть совмещены со скриптом, который этот Restore запускает


Дело в том, что базы, которые ресторятся, хранятся на лентах и по запросу этих самых пользователей восстанавливаются на отдельный инстанс.
Беда в том, что есть базы, совсем древние, у которых полная каша с правами к ним.
Чать пользователей присутствуют и в этих базах, а часть нет. Вот и приходится после восстановления баз права раздавать, согласно текущему составу пользователей.
Если Restore идет через SP, то проблем нет.
Но часть баз, причем самая старая, backup'илась DataProtect'ором и может быть восстановлена только им напрямую в SQL (как утверждают админы этой зверушки).
Уж больно нехочется sysadmin'ами всех делать, даже на отдельном инстансе...
mike909
Дата: 27.01.2009 15:01:49
Greenhorn,

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

Но!

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

Итак.
Делаем все как в BOL -> CREATE EVENT NOTIFICATION для события EVENTLOG.
В reader'е вставляем следующий код
    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
Greenhorn
Дата: 27.01.2009 17:19:57
mike909,

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

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

Т.е. Если чего-то не срастется, то я узнаю об этом только когда пользователи заарут ?
А есть ли еще какие подводные камни ?
А нет ли у кого функции по выдиранию значений параметров на основе шаблона из sys.messages
Т.е. имеем сообщение типа
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
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.

Для сообщения указанного выше хочу получить что то типа
select dbo.GetValueFromMsg(18267, 1, @MessageText), dbo.GetValueFromMsg(18267, 2, @MessageText)
---
test, 2008/11/25
AndrF
Дата: 02.08.2021 15:07:52
Знаю что сам вопрос стар, но просто чтобы сохранился в поиске еще один способ решения подобных вопросов, процитирую ответ с форума мелкомягких:

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.

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