Не очень понятно как воспользоваться обработкой для восстановления, если база валится и при запуске в пользовательском режиме.
=============================
Кажется дошло, её можно запустить из под любой другой живой базы.
Как мне кажется минус в том, что требуется делать бэкапы вручную. По любому именно при падении базы и поймешь, что забыл об этом.
Резервное копирование, все таки должно быть автоматическим. И желательно хранить несколько последних копий, а не только крайнюю.
У меня каждые 20 минут на SQL-сервере выполняется задание, которое копирует конфу в специальную базу.
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
GO
DECLARE @SQL varchar(8000), @table_name varchar(100)
SET @table_name = '[Conf_Backup].[dbo].[Config_' + LEFT(CONVERT(VARCHAR, GETDATE(), 120), 16) + ']'
SET @table_name = REPLACE(@table_name, '-', '_')
SET @table_name = REPLACE(@table_name, ':', '_')
SET @table_name = REPLACE(@table_name, ' ', '_')
SET @SQL = 'CRE ATE TABLE '+@table_name+'
(
[FileName] [nvarchar](128) NOT NULL,
[Creation] [datetime] NOT NULL,
[Modified] [datetime] NOT NULL,
[Attributes] [smallint] NOT NULL,
[DataSize] [int] NOT NULL,
[BinaryData] [image] NOT NULL,
PRIMARY KEY CLUSTERED
(
[FileName] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
INS ERT INTO '+@table_name+'
SEL ECT * FR OM [BUH].[dbo].[Config]'
exec(@SQL)
GO
Показать
Ночью эта база очищается, чтобы не разрасталась:
USE [Conf_Backup]
GO
declare @i int
set @i = 0
while (@i<99)
begin
declare @table_name varchar(100)
declare table_list cursor for
sel ect name fr om sysobjects o2 wh ere xtype='U' and
not exists (
sel ect * fr om sysforeignkeys k
join syscolumns c1 on (k.fkeyid = c1.id and c1.colid=k.fkey)
join syscolumns c2 on (k.rkeyid = c2.id and c2.colid=k.rkey)
wh ere c2.id = o2.id and c1.id <> o2.id
)
open table_list
fetch next from table_list into @table_name
while @@fetch_status = 0
begin
print 'dropping table '+@table_name
exec ('dr op table '+@table_name)
fetch next fr om table_list into @table_name
end
close table_list
deallocate table_list
set @i = @i+1
end
go
Показать
В случае неудачного демонического обновления база восстанавливается за 30 секунд:
GO
DR OP TABLE [BUH].[dbo].[Config]
GO
SET ANSI_NULLS ON
GO
SE T QUOTED_IDENTIFIER ON
GO
CRE ATE TABLE [BUH].[dbo].[Config](
[FileName] [nvarchar](128) NOT NULL,
[Creation] [datetime] NOT NULL,
[Modified] [datetime] NOT NULL,
[Attributes] [smallint] NOT NULL,
[DataSize] [int] NOT NULL,
[BinaryData] [image] NOT NULL,
PRIMARY KEY CLUSTERED
(
[FileName] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
INS ERT INTO [BUH].[dbo].[Config]
SELE CT * FR OM [Conf_Backup].[dbo].[%ИмяТаблицыСКрайнимБэкапом%]
GO
Показать
Таким образом получается автоматическое резервное копирование таблицы с конфигурацией каждые 20 минут. Больше 20 минут работы не потеряешь.
Обработка - задумка хорошая, только её бы расширить немного, чтобы умела настраивать на SQL-сервере автоматическое резервное копирование.