Часто возникает необходимость почистить базу данных от документов и задач. Например, когда ее надо кому-нибудь передать или сделать небольшую базу разработки. Но во-первых, не у всех под рукой список таблиц, которые нужно очищать. Во-вторых, многие забывают, что удалять шаблоны и макеты из базы данных не стоит. В третьих, чистить таблицы при помощи 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
Денис, решил воспользоваться твоим скриптом, неболшие вопросы:
Т.е. удаляются не сами электронные документы, а именно карточки электронных документов?
Сначала карточки, потом тела (версии). Смотри скрипт целиком и все комментарии в нем.
Воспользовался данным скриптом. База ужалась с 27 гигов до 300 мб. Доволен как удав . Очень удобно, когда надо "неподъемную" базу клиента утащить с собой для удаленной разработки. Большое спасибо за этот скрипт!
для БД 4.8 будет работать?
Будет
а как можно ограничить удаление обложек папок?
Думаю надо как-то так делать во временных таблицах:
А что будет с документами в файловом хранилище?
В самом начале неправильно указаны таблицы. Должно быть:
Действительно, спасибо. Исправил.
Отличие для 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, в одном месте начал ругаться, исправили строку
declare @ColumnList varchar(2000)
на
declare @ColumnList varchar(max)
и все заработало.
Оптимизированная версия скрипта (без delete)
а что за 'Ўјƒ'?
Выше есть комментарий "-- Удалить карточки документов кроме шаблонов и макетов"
Правильная строка: select @TemplatesCardTypeID = TypeID from SBEDocTypes where Code = 'ШАД'
Прошу прощения, не досмотрел, когда копипастил скрипт в комментарий.
А тела документов из БД как зачистить. отдельный скрипт есть?
>> А тела документов из БД как зачистить. отдельный скрипт есть?
Тела хранятся в таблице SBEDocVer и она чистится.
Тела документов с ФХ можно вручную удалить.
Недавно в очередной раз воспользовался скриптом. При этом он у меня крутился двое суток и пришлось его принудительно остановить. При удалении записей из SBlinks работает крайне долго. Оказалось что при удалении там срабатывает триггер на очистку SBLinksFullEDoc, а записей там очень много (порядка 155 000 000) + примерно столько же в SBLinks с учетом связок задач и заданий.
Пришлось вначале чистить ее по частям:
И только потом чистить SBLinks с отключением триггеров
Владимир, а это для какой версии Directum?
Авторизуйтесь, чтобы написать комментарий