Часто возникает необходимость почистить базу данных от документов и задач. Например, когда ее надо кому-нибудь передать или сделать небольшую базу разработки. Но во-первых, не у всех под рукой список таблиц, которые нужно очищать. Во-вторых, многие забывают, что удалять шаблоны и макеты из базы данных не стоит. В третьих, чистить таблицы при помощи 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)
-- Удалить временные таблицы, если они есть 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 = 'ШАД'
Прошу прощения, не досмотрел, когда копипастил скрипт в комментарий.
А тела документов из БД как зачистить. отдельный скрипт есть?
>> А тела документов из БД как зачистить. отдельный скрипт есть?
Тела хранятся в таблице SBEDocVer и она чистится.
Тела документов с ФХ можно вручную удалить.
Недавно в очередной раз воспользовался скриптом. При этом он у меня крутился двое суток и пришлось его принудительно остановить. При удалении записей из SBlinks работает крайне долго. Оказалось что при удалении там срабатывает триггер на очистку SBLinksFullEDoc, а записей там очень много (порядка 155 000 000) + примерно столько же в SBLinks с учетом связок задач и заданий.
Пришлось вначале чистить ее по частям:
И только потом чистить SBLinks с отключением триггеров
Владимир, а это для какой версии Directum?
Авторизуйтесь, чтобы написать комментарий