Заполните таблицу 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