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

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

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

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

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

Что же делать? Конечно, обратиться к более быстрым методам — 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 не будет опубликован. Обязательные поля помечены *