Очистка базы данных от документов и задач

38 26

Часто возникает необходимость почистить базу данных от документов и задач. Например, когда ее надо кому-нибудь передать или сделать небольшую базу разработки. Но во-первых, не у всех под рукой список таблиц, которые нужно очищать. Во-вторых, многие забывают, что удалять шаблоны и макеты из базы данных не стоит. В третьих, чистить таблицы при помощи delete не всегда оптимально, а не полная чистка таблиц при помощи truncate может вызвать затруднения, т.к. требует использования динамического SQL. Поэтому представляю вашему вниманию SQL-скрипт удаления документов, задач и заданий.

Скрипт работает на SQL 2005, на 2000 потребуются некоторые изменения в части обращения к системным таблицам сервера. Версии DIRECTUM 4.5 - 4.8.

Разумеется, если требуется уменьшить физический размер базы данных, то получившееся в результате выполнения скрипта свободное место в БД нужно освободить командой Shrink.

-- Удалить временные таблицы, если они есть
	if  exists (select * from sys.objects 
	  where object_id = object_id(N'tmpSBEDoc') and type in (N'U'))
	drop table tmpSBEDoc
	if  exists (select * from sys.objects 
	  where object_id = object_id(N'tmpSBEDocVer') and type in (N'U'))
	drop table tmpSBEDocVer
	if  exists (select * from sys.objects 
	  where object_id = object_id(N'tmpSBEDocAcc') and type in (N'U'))
	drop table tmpSBEDocAcc
	
-- Удалить карточки документов кроме шаблонов и макетов
	declare @DocumentModelsCardTypeID int
	declare @TemplatesCardTypeID int

	select @DocumentModelsCardTypeID = TypeID from SBEDocTypes where Code = 'DocumentModels'
	select @TemplatesCardTypeID = TypeID from SBEDocTypes where Code = 'ШАД'

	select * into tmpSBEDoc from SBEDoc
	  where (TypeID = @DocumentModelsCardTypeID) or (TypeID = @TemplatesCardTypeID)
	  
	alter table tmpSBEDoc drop column timestamp

	declare @ColumnList varchar(2000)
	select @ColumnList = COALESCE(@ColumnList + ', ', '') + column_name
	  from information_schema.columns 
	  where table_name = 'SBEDoc'
	        and column_name <> 'timestamp' 
	  order by ordinal_position
  
	alter table SBEDoc disable trigger all
	set identity_insert SBEDoc on

	truncate table SBEDoc
	exec('insert into SBEDoc (' + @ColumnList +') select * from tmpSBEDoc')

	set identity_insert SBEDoc off
	alter table SBEDoc enable trigger all

-- Удалить версии документов кроме шаблонов и макетов
	select * into tmpSBEDocVer from SBEDocVer where 
	  (TypeID = @DocumentModelsCardTypeID) or (TypeID = @TemplatesCardTypeID)
	alter table tmpSBEDocVer drop column timestamp
	select @ColumnList = NULL
	select @ColumnList = COALESCE(@ColumnList + ', ', '') + column_name
    	from information_schema.columns 
    	where table_name = 'SBEDocVer' 
    	      and column_name <> 'timestamp' 
    	order by ordinal_position

	alter table SBEDocVer disable trigger all
	set identity_insert SBEDocVer on

	truncate table SBEDocVer
	exec('insert into SBEDocVer (' + @ColumnList +') select * from tmpSBEDocVer')

	set identity_insert SBEDocVer off
	alter table SBEDocVer enable trigger all

-- Удалить права доступа на документы кроме шаблонов и макетов
	select * into tmpSBEDocAcc from SBEDocAcc where 
	  (TypeID = @DocumentModelsCardTypeID) or (TypeID = @TemplatesCardTypeID)
	alter table tmpSBEDocAcc drop column timestamp
	select @ColumnList = NULL
	select @ColumnList = COALESCE(@ColumnList + ', ', '') + column_name
    	from information_schema.columns 
    	where table_name = 'SBEDocAcc' 
    	      and column_name <> 'timestamp' 
    	order by ordinal_position

	alter table SBEDocAcc disable trigger all
	set identity_insert SBEDocAcc on

	truncate table SBEDocAcc
	exec('insert into SBEDocAcc (' + @ColumnList +') select * from tmpSBEDocAcc')

	set identity_insert SBEDocAcc off
	alter table SBEDocAcc enable trigger all
	
-- Удалить связи документов, задач и заданий
	delete from SBLinks where DestType = 'E' or SourceType = 'E' 
	                          or DestType = 'T' or DestType = 'J'

-- Удалить подписи документов
    truncate table SBEDocSignature

-- Удалить историю
	truncate table SBEDocProtocol
	truncate table SBTaskProtocol
	truncate table XProtokol	

-- Удалить все задачи и задания
	truncate table SBTask
	truncate table SBTaskJob
	truncate table SBTaskAcc
	truncate table SBTaskAttach
	truncate table SBTaskText
	truncate table SBTaskRoute
	truncate table SBTaskObserv
	truncate table SBTaskSignature
	truncate table SBWorkflowProcessing

-- Удалить временные таблицы
	if  exists (select * from sys.objects where object_id = object_id(N'tmpSBEDoc') and type in (N'U'))
	drop table tmpSBEDoc
	if  exists (select * from sys.objects where object_id = object_id(N'tmpSBEDocVer') and type in (N'U'))
	drop table tmpSBEDocVer
	if  exists (select * from sys.objects where object_id = object_id(N'tmpSBEDocAcc') and type in (N'U'))
	drop table tmpSBEDocAcc
Отредактировал Денис Баранов, 23.04.2013 в 10:49
Отредактировал Денис Баранов, 07.06.2013 в 14:02
38
Авторизуйтесь, чтобы оценить материал.
3
Алексей Немцев

Денис, решил воспользоваться твоим скриптом, неболшие вопросы:

-- Удалить карточки документов кроме шаблонов и макетов

Т.е. удаляются не сами электронные документы, а именно карточки электронных документов?

 

Денис Баранов

Сначала карточки, потом тела (версии). Смотри скрипт целиком и все комментарии в нем. smiley

Дмитрий Тарасов

Воспользовался данным скриптом. База ужалась с 27 гигов до 300 мб. Доволен как удав smiley . Очень удобно, когда надо "неподъемную" базу клиента утащить с собой для удаленной разработки. Большое спасибо за этот скрипт!

Анатолий Придыбайло

для БД 4.8 будет работать?

Денис Баранов

Будет

Анатолий Придыбайло

а как можно ограничить удаление обложек папок?

Алексей Пестов

Думаю надо как-то так делать во временных таблицах:
 

select * into tmpSBEDoc from SBEDoc
	  where (TypeID = @DocumentModelsCardTypeID) or (TypeID = @TemplatesCardTypeID)
                or (XRecID in (select Right(F.Url,Len(F.Url)-PATINDEX ('%id=%' , F.Url)-2)
                from Sbfolder F
                where F.url is not null))
Александр Гурин

А что будет с документами в файловом хранилище?

Денис Баранов
А что будет с документами в файловом хранилище?

В базе карточки удалятся, а сами тела документов - нет.
Людмила Клевкова

В самом начале неправильно указаны таблицы. Должно быть:

     if  exists (select * from sys.objects 
        where object_id = object_id(N'tmpSBEDoc') and type in (N'U'))
      drop table tmpSBEDoc
      if  exists (select * from sys.objects 
        where object_id = object_id(N'tmpSBEDocVer') and type in (N'U'))
      drop table tmpSBEDocVer
      if  exists (select * from sys.objects 
        where object_id = object_id(N'tmpSBEDocAcc') and type in (N'U'))
      drop table tmpSBEDocAcc
Денис Баранов

Действительно, спасибо. Исправил.

Денис Баранов

Отличие для 2000го сервера состоит в том, что там нет "sys.objects" и проверка на существование таблиц происходит по-другому (нужно обращаться к базе master, насколько я еще помню). Но можно и не проверять существование таблиц, убрать все проверки, т.е. блоки удаления временных таблиц в начале и в конце будут выглядеть так:

-- Удалить временные таблицы, если они есть  
    drop table tmpSBEDoc
    drop table tmpSBEDocVer
    drop table tmpSBEDocAcc

Если таких таблиц нет, то сервер будет ругаться на этот запрос, но в этом нет ничего страшного, все равно все сработает как надо.

В самом начале неправильно указаны таблицы. Должно быть:
if  exists (select * from sys.objects         where object_id = object_id(N'tmpSBEDoc') and type in (N'U'))
drop table tmpSBEDoc
if  exists (select * from sys.objects         where object_id = object_id(N'tmpSBEDocVer') and type in (N'U'))
drop table tmpSBEDocVer
if  exists (select * from sys.objects         where object_id = object_id(N'tmpSBEDocAcc') and type in (N'U'))
drop table tmpSBEDocAcc
В самом конце такая же ошибка.
Денис Баранов
В самом конце такая же ошибка.

Проглядел, спасибо.
Владимир Гладких

на 491 пойдет?

Адик Крымгужин
Отличный скрипт! Очень выручил!
Артур Поляков

Для версии 5.0 отработает корректно?

Артур Поляков

и для 4.9.1 никто не ответил о совместимости. Есть результаты?

Павел Чичиланов

 

и для 4.9.1 никто не ответил о совместимости. Есть результаты?

Пробовали на 4.9.1, в одном месте начал ругаться, исправили строку

declare @ColumnList varchar(2000)

на

declare @ColumnList varchar(max)

и все заработало.

Андрей Шестаков

Оптимизированная версия скрипта (без delete)


-- Удалить временные таблицы, если они есть
	if  exists (select * from sys.objects 
	  where object_id = object_id(N'tmpSBEDoc') and type in (N'U'))
	drop table tmpSBEDoc
	if  exists (select * from sys.objects 
	  where object_id = object_id(N'tmpSBEDocVer') and type in (N'U'))
	drop table tmpSBEDocVer
	if  exists (select * from sys.objects 
	  where object_id = object_id(N'tmpSBEDocAcc') and type in (N'U'))
	drop table tmpSBEDocAcc
	
	if  exists (select * from sys.objects 
	  where object_id = object_id(N'tmpSBLinks') and type in (N'U'))
	drop table tmpSBLinks

GO
	
-- Удалить карточки документов кроме шаблонов и макетов
	declare @DocumentModelsCardTypeID int
	declare @TemplatesCardTypeID int

	select @DocumentModelsCardTypeID = TypeID from SBEDocTypes where Code = 'DocumentModels'
	select @TemplatesCardTypeID = TypeID from SBEDocTypes where Code = 'ШАД'

	select * into tmpSBEDoc from SBEDoc
	  where (TypeID = @DocumentModelsCardTypeID) or (TypeID = @TemplatesCardTypeID)
	  
	alter table tmpSBEDoc drop column timestamp

	declare @ColumnList varchar(2000)
	select @ColumnList = COALESCE(@ColumnList + ', ', '') + column_name
	  from information_schema.columns 
	  where table_name = 'SBEDoc'
	        and column_name <> 'timestamp' 
	  order by ordinal_position
  
	alter table SBEDoc disable trigger all
	set identity_insert SBEDoc on

	truncate table SBEDoc
	exec('insert into SBEDoc (' + @ColumnList +') select * from tmpSBEDoc')

	set identity_insert SBEDoc off
	alter table SBEDoc enable trigger all

-- Удалить версии документов кроме шаблонов и макетов
	select * into tmpSBEDocVer from SBEDocVer where 
	  (TypeID = @DocumentModelsCardTypeID) or (TypeID = @TemplatesCardTypeID)
	alter table tmpSBEDocVer drop column timestamp
	select @ColumnList = NULL
	select @ColumnList = COALESCE(@ColumnList + ', ', '') + column_name
    	from information_schema.columns 
    	where table_name = 'SBEDocVer' 
    	      and column_name <> 'timestamp' 
    	order by ordinal_position

	alter table SBEDocVer disable trigger all
	set identity_insert SBEDocVer on

	truncate table SBEDocVer
	exec('insert into SBEDocVer (' + @ColumnList +') select * from tmpSBEDocVer')

	set identity_insert SBEDocVer off
	alter table SBEDocVer enable trigger all

-- Удалить права доступа на документы кроме шаблонов и макетов
	select * into tmpSBEDocAcc from SBEDocAcc where 
	  (TypeID = @DocumentModelsCardTypeID) or (TypeID = @TemplatesCardTypeID)
	alter table tmpSBEDocAcc drop column timestamp
	select @ColumnList = NULL
	select @ColumnList = COALESCE(@ColumnList + ', ', '') + column_name
    	from information_schema.columns 
    	where table_name = 'SBEDocAcc' 
    	      and column_name <> 'timestamp' 
    	order by ordinal_position

	alter table SBEDocAcc disable trigger all
	set identity_insert SBEDocAcc on

	truncate table SBEDocAcc
	exec('insert into SBEDocAcc (' + @ColumnList +') select * from tmpSBEDocAcc')

	set identity_insert SBEDocAcc off
	alter table SBEDocAcc enable trigger all

GO
	
-- Удалить св¤зи документов, задач и заданий

	truncate table SBLinksFullEDoc
GO

	select * into tmpSBLinks from SBLinks
	  where DestType <> 'E' 
	        and SourceType <> 'E' 
	        and DestType <> 'T' 
	        and DestType <> 'J'
	  

	declare @ColumnList varchar(2000)
	select @ColumnList = COALESCE(@ColumnList + ', ', '') + column_name
	  from information_schema.columns 
	  where table_name = 'SBLinks'
	        and column_name <> 'timestamp' 
	  order by ordinal_position
  
	alter table SBLinks disable trigger all


	truncate table SBLinks
	exec('insert into SBLinks (' + @ColumnList +') select * from tmpSBLinks')


	alter table SBLinks enable trigger all

GO

-- Удалить подписи документов
    truncate table SBEDocSignature

GO

-- Удалить историю
	truncate table SBEDocProtocol
GO

	truncate table SBTaskProtocol
GO

	truncate table XProtokol	

GO

-- Удалить все задачи и задани¤
	truncate table SBTask
	
	GO
	
	truncate table SBTaskJob
	
	GO
	
	truncate table SBTaskAcc
	
	GO
	
	truncate table SBTaskAttach
	
	GO
	
	truncate table SBTaskText
	
	GO
	
	truncate table SBTaskRoute
	
	GO
	
	truncate table SBTaskObserv
	
	GO
	
	truncate table SBTaskSignature
	
	GO
	
	truncate table SBWorkflowProcessing
	
	GO
	

-- Удалить временные таблицы
	if  exists (select * from sys.objects where object_id = object_id(N'tmpSBEDoc') and type in (N'U'))
	drop table tmpSBEDoc
	if  exists (select * from sys.objects where object_id = object_id(N'tmpSBEDocVer') and type in (N'U'))
	drop table tmpSBEDocVer
	if  exists (select * from sys.objects where object_id = object_id(N'tmpSBEDocAcc') and type in (N'U'))
	drop table tmpSBEDocAcc
	
	if  exists (select * from sys.objects where object_id = object_id(N'tmpSBLinks') and type in (N'U'))
	drop table tmpSBLinks
	
	GO
	

 

Анатолий Придыбайло
select @TemplatesCardTypeID = TypeID from SBEDocTypes where Code = 'Ўјƒ'

а что за 'Ўјƒ'?

Андрей Шестаков
select @TemplatesCardTypeID = TypeID from SBEDocTypes where Code = 'Ўјƒ' а что за 'Ўјƒ'?

Выше есть комментарий "-- Удалить карточки документов кроме шаблонов и макетов"
Правильная строка: select @TemplatesCardTypeID = TypeID from SBEDocTypes where Code = 'ШАД'

Прошу прощения, не досмотрел, когда копипастил скрипт в комментарий.

Константин Егоров

А тела документов из БД как зачистить. отдельный скрипт есть?

Андрей Шестаков

>> А тела документов из БД как зачистить. отдельный скрипт есть?

Тела хранятся в таблице SBEDocVer и она чистится.

Тела документов с ФХ можно вручную удалить.

Владимир Гладких

Недавно в очередной раз воспользовался скриптом. При этом он у меня крутился двое суток и пришлось его принудительно остановить. При удалении записей из SBlinks работает крайне долго. Оказалось что при удалении там срабатывает триггер на очистку SBLinksFullEDoc, а записей там очень много (порядка 155 000 000) + примерно столько же в SBLinks с учетом связок задач и заданий.
Пришлось вначале чистить ее по частям:

delete fulldoc  from SBLinksFullEDoc fulldoc
inner join (select SourceID, DestID from SBLinks links   
		where links.SourceType = 'E' and links.DestType = 'E' and links.SourceSystemCode is null ) Q
 on (Q.DestID = fulldoc.SourceId and Q.SourceID = fulldoc.DestId)

delete fulldoc  from SBLinksFullEDoc fulldoc
inner join (select SourceID, DestID from SBLinks links   
		where links.SourceType = 'E' and links.DestType = 'E' and links.SourceSystemCode is null ) Q
 on (Q.SourceId  = fulldoc.SourceId and Q.DestID= fulldoc.DestId)

И только потом чистить SBLinks с отключением триггеров
 

alter table SBLinks disable trigger all
delete from SBLinks where DestType = 'E' or SourceType = 'E'   or
							   DestType = 'T' or DestType = 'J'
alter table SBLinks enable trigger all

 

Анатолий Придыбайло

Владимир, а это для какой версии Directum?

Авторизуйтесь, чтобы написать комментарий