Заполните таблицу schema_only некоторыми начальными значениями - PullRequest
0 голосов
/ 13 декабря 2018

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

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

edit:

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

1 Ответ

0 голосов
/ 17 декабря 2018

Вы можете обнаружить 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
...