Действительно быстрая очистка всей регистрации изменений

Если вы хоть раз сталкивались с проблемой накопленных изменений при обмене, то данная статья может оказаться полезной

Первый вопрос, который, наверное, возникает у того, перед кем подобная задача никогда не стояла, «зачем?».
Чем не нравится «ПланыОбмена.УдалитьРегистрациюИзменений(…)»?

Только вот, допустим, у вас обмен, который происходит раз в минуту, «встал». И так не обменивался дня так два.
При этом в базе работают более сотни пользователей, которые всё это время туда что-то вносили и продолжают вносить.
Шансов, что обмен данными будет успешным, в этом случае практически нет. Обычно создаётся новый узел обмена, делается резервная копия базы, потом «Планы обмена.УстановитьГлавныйУзел» и удалить существующий узел. 
Потому как он будет копить регистрацию изменений и замедлять запись даных в БД 

Удаление регистрации изменений может занять от десятков минут до десятков часов. 
И всё это время будет открыта транзакция, соответственно работать в базе будет невозможно.

Что же делать? Конечно, обратиться к более быстрым методам — MS SQL.

Для начала следует создать в БД следующую хранимую процедуру:

USE [ИмяБД]
GO

CREATE PROCEDURE usp_GenerateSQL
    @Pattern AS varchar(255)
    ,@PrintQuery AS bit
    ,@ExecQuery AS bit
AS
BEGIN
    DECLARE @sql AS varchar(max)

    SELECT @sql = COALESCE(@sql, ») + ‘truncate table [‘ + TABLE_NAME + ‘]’ + CHAR(13) + CHAR(10)
    FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_NAME LIKE @Pattern

    IF @PrintQuery = 1 PRINT @sql
    IF @ExecQuery = 1 EXEC (@sql)
END

GO

Что она делает? Перебирает все таблицы в БД по части их имени и выполняет для них инструкцию Truncate Table
А далеее всё просто:

exec usp_GenerateSQL @Pattern = ‘%Chng%’, @PrintQuery = 0, @ExecQuery = 1

И за пару секунд все таблицы регистрации будут очищены. В чём прикол? В Truncate Table, конечно.
Эта инструкция очищает БД без записи в лог, без транзакции, т.е. очень очень быстро.

P.S. Всё выше описанное, конечно, приведено только в ознакомительных целях и никогда мной не делалось 🙂
P.P.S. Автор не несёт никакой ответственности за любой ущерб вашей БД, который могут повлечь за собой эти действия.
P.P.P.S. Если в финальной строчке заменить «Chng» на «Doc» или «Rg», можно соответственно удалить все документы или все регистры из БД… также за пару секунд.

12 Comments

  1. Brawler

    кулл хацкеры кругом))

    Reply ↓
  2. DrAku1a

    Вы открыли для себя TRUNCATE?

    А вообще плюс — за универсальную процедуру.

    Reply ↓
  3. comol

    (2) DrAku1a, Нее… я открыл для себя процедуру поиска таблицы по части названия… 🙂

    Reply ↓
  4. teller
    P.S. Всё выше описанное, конечно, приведено только в ознакомительных целях и никогда мной не делалось 🙂

    P.P.S. Автор не несёт никакой ответственности за любой ущерб вашей БД, который могут повлечь за собой эти действия.

    +100500

    Reply ↓
  5. logarifm

    Не забываем, что этим мы нарушаем лицензионное соглашение 1С.

    Reply ↓
  6. sitec

    +1 За поиск таблиц по части имени

    Reply ↓
  7. Makushimo

    Особенно понравилось, «сам так не делал, но вы будьте осторожны» ))))

    Красавчег.

    Дал ребенку заряженный пистолет и довольный ходит.

    Reply ↓
  8. корум

    (7) Makushimo, табличка *сарказм* в руках автора обязательна, ага

    Reply ↓
  9. user611061_igor_panshin

    Одна бравада. DECLARE @sql AS varchar(max) имеет ограничения по длине, поэтому «все таблицы регистрации будут очищены. » — это ошибка.

    Reply ↓
  10. comol

    (9)

    Одна бравада

    ну и зачем оскорбления?!

    это ошибка.

    и в чём нашли ошибку?! В типовой рознице varchar(max) вполне хватает для скрипта очистки всех таблиц и успешно использовалось на практике.

    Код вполне себе открыт — если очищаете ERP разбейте на несколько кусочков. Зачем писать гневные коменты…. вот люди

    Reply ↓
  11. user611061_igor_panshin

    declare @nm varchar(1000)

    DECLARE cur CURSOR FOR

    sel ect

    distinct

    name

    fr om

    sysobjects

    wh ere xtype=’U’

    and name like ‘%Chng%’

    order by

    name

    —Откроем курсор

    OPEN cur

    —Выборка данных первой строки

    FETCH NEXT FROM cur INTO @nm

    —Пока есть данные в курсоре — выборка циклом

    WHILE @@FETCH_STATUS = 0

    BEGIN

    print ‘truncate table [‘+@nm+’]’ + CHAR(13) + CHAR(10)

    —Выборка следующей строки

    FETCH NEXT FR OM cur INTO @nm

    END

    —Закрываем курсор

    CLOSE cur

    —Уничтожаем курсор

    DEALLOCATE cur

    Reply ↓
  12. comol

    (11) это что, вы открыли для себя курсоры? :)). Следующим этапом будут временные таблицы :). Ну если не хватает длинны строчки меняйте просто на выполнение запроса сразу. Truncate работает мгновенно, выполнением единым пакетом экономите секунд 5 :))).

    Reply ↓

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *