Заполните таблицу schema_only некоторыми начальными значениями

Можно ли заполнить таблицу schema_only (с некоторыми начальными значениями) при запуске базы данных, например, вызвав хранимую процедуру?

Логика, которая обычно работает на этой таблице, была бы более сложной, если бы мне пришлось определять, произошел ли холодный старт.

редактировать:

Это похоже на sp_procoption получает меня на полпути туда. Однако настроенная таким образом хранимая процедура не выполняется, когда ALTER DATABASE <dbname> SET ONLINE; это запустить. Что является обломом, потому что данные исчезают, когда ALTER DATABASE <dbname> SET OFFLINE; это запустить.

1 ответ

Решение

Вы можете обнаружить ALTER DATABASE <dbname> SET ONLINE; операторы с DDL-триггером для типа события ALTER_DATABASE. Трудно найти, когда его состояние изменяется с OFFLINE на ONLINE (вместо некоторого другого оператора ALTER DATABASE, например, MODIFY FILE). Когда триггер срабатывает, функция EVENTDATA() возвращает XML следующим образом:

<EVENT_INSTANCE>
  <EventType>ALTER_DATABASE</EventType>
  <PostTime>2018-12-17T16:26:25.250</PostTime>
  <SPID>80</SPID>
  <ServerName>xxxxxxx</ServerName>
  <LoginName>xxxxxxxxxxxxxxxxxx</LoginName>
  <DatabaseName>xxxxx</DatabaseName>
  <TSQLCommand>
    <SetOptions ANSI_NULLS="ON" ANSI_NULL_DEFAULT="ON" ANSI_PADDING="ON" QUOTED_IDENTIFIER="ON" ENCRYPTED="FALSE" />
    <CommandText>ALTER DATABASE xxxxx SET OFFLINE</CommandText>
  </TSQLCommand>
</EVENT_INSTANCE>


<EVENT_INSTANCE>
  <EventType>ALTER_DATABASE</EventType>
  <PostTime>2018-12-17T16:26:36.953</PostTime>
  <SPID>80</SPID>
  <ServerName>xxxxxxx</ServerName>
  <LoginName>xxxxxxxxxxxxxxxxxx</LoginName>
  <DatabaseName>xxxxx</DatabaseName>
  <TSQLCommand>
    <SetOptions ANSI_NULLS="ON" ANSI_NULL_DEFAULT="ON" ANSI_PADDING="ON" QUOTED_IDENTIFIER="ON" ENCRYPTED="FALSE" />
    <CommandText>ALTER DATABASE xxxxx SET ONLINE</CommandText>
  </TSQLCommand>
</EVENT_INSTANCE>

По идее можно попробовать разобрать <CommandText>, но это может быть не так просто, как кажется. Вместо этого вы можете проверить, находится ли ваша база данных в данный момент в режиме онлайн и есть ли какие-либо строки в таблице schema_only. Конечно, в триггере вы также должны проверить, относится ли это событие к вашей базе данных. Таким образом, триггер может выглядеть примерно так:

CREATE TRIGGER DDL_ALTER_DATABASE_TRIGGER
ON ALL Server
FOR ALTER_DATABASE
AS
BEGIN
    declare @DatabaseName nvarchar(200), @TSQL nvarchar(2000), @event XML

    select @event = EVENTDATA()

    select @DatabaseName = @event.value('(/EVENT_INSTANCE/DatabaseName)[1]','varchar(200)' )
    select @TSQL = @event.value('(/EVENT_INSTANCE/TSQLCommand)[1]','varchar(2000)' ) -- Check the command text if you want

    if @DatabaseName = '<my database name>'
    begin
        declare @DatabaseCurrentState int

        select @DatabaseCurrentState = state
        from sys.databases
        where name = '<my database name>'

        if @DatabaseCurrentState = 0 -- It is ONLINE now
        begin
            if not exists(select * from [<my database name>].schema.schema_only_table)
            begin
                insert into [<my database name>].schema.schema_only_table(field1, field2)
                values(1, 2)
                -- or simply execute your auto executed stored procedure here
            end
        end
    end
END
Другие вопросы по тегам