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