Первый вопрос, который, наверное, возникает у того, перед кем подобная задача никогда не стояла, «зачем?».
Чем не нравится «ПланыОбмена.УдалитьРегистрациюИзменений(…)»?
Только вот, допустим, у вас обмен, который происходит раз в минуту, «встал». И так не обменивался дня так два.
При этом в базе работают более сотни пользователей, которые всё это время туда что-то вносили и продолжают вносить.
Шансов, что обмен данными будет успешным, в этом случае практически нет. Обычно создаётся новый узел обмена, делается резервная копия базы, потом «Планы обмена.УстановитьГлавныйУзел» и удалить существующий узел.
Потому как он будет копить регистрацию изменений и замедлять запись даных в БД
Удаление регистрации изменений может занять от десятков минут до десятков часов.
И всё это время будет открыта транзакция, соответственно работать в базе будет невозможно.
Что же делать? Конечно, обратиться к более быстрым методам — 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», можно соответственно удалить все документы или все регистры из БД… также за пару секунд.
кулл хацкеры кругом))
Вы открыли для себя TRUNCATE?
А вообще плюс — за универсальную процедуру.
(2) DrAku1a, Нее… я открыл для себя процедуру поиска таблицы по части названия… 🙂
P.P.S. Автор не несёт никакой ответственности за любой ущерб вашей БД, который могут повлечь за собой эти действия.
+100500
Не забываем, что этим мы нарушаем лицензионное соглашение 1С.
+1 За поиск таблиц по части имени
Особенно понравилось, «сам так не делал, но вы будьте осторожны» ))))
Красавчег.
Дал ребенку заряженный пистолет и довольный ходит.
(7) Makushimo, табличка *сарказм* в руках автора обязательна, ага
Одна бравада. DECLARE @sql AS varchar(max) имеет ограничения по длине, поэтому «все таблицы регистрации будут очищены. » — это ошибка.
(9)
ну и зачем оскорбления?!
и в чём нашли ошибку?! В типовой рознице varchar(max) вполне хватает для скрипта очистки всех таблиц и успешно использовалось на практике.
Код вполне себе открыт — если очищаете ERP разбейте на несколько кусочков. Зачем писать гневные коменты…. вот люди
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
(11) это что, вы открыли для себя курсоры? :)). Следующим этапом будут временные таблицы :). Ну если не хватает длинны строчки меняйте просто на выполнение запроса сразу. Truncate работает мгновенно, выполнением единым пакетом экономите секунд 5 :))).