Программа iNETsHOP - обработка, сравнение, анализ прайс листов поставщиков, создание каталога товаров интернет магазина Форум - SQL Server мелкософт копирайтед - Работа с базой данных - как безболезненно уменьшить размер базы с разросшимся dbo.TBL_LOG и правильно удалять старые бэкапы


http://inetshop.in.ua/index.php?p=showtopic&toid=351&area=1&print_post=2164
28.09.2016 18:04

support


Support


Количество сообщений   1199
Зарегистрирован:   11-04-2008, 19:11:57
В настройках программы (в окне "Администрирование") вы можете убрать логирование справочник товаров поставщиков, что так же сократит нагрузку на диск при записи прайс-листа.

Удалить историю справочник товаров поставщиков можно следующим SQL-запросом:
Код

set nocount on;
DECLARE @iS_ID int, @iSG_ID int, @iLOG_ID int, @sLOG_FIELD_NAME varchar(150);
DECLARE cSuppliers CURSOR LOCAL FOR
select
S_ID
from TBL_SUPPLIERS s
-- where s.S_ID = 781
order by s.S_ID
;

OPEN cSuppliers;
FETCH NEXT FROM cSuppliers INTO @iS_ID;
WHILE (@@FETCH_STATUS <> -1)
BEGIN
DECLARE cSuppliersGoods CURSOR LOCAL READ_ONLY FOR
select
SG_ID
from TBL_SUPPLIERS_GOODS sg
where sg.SG_S_ID = @iS_ID;
PRINT @iS_ID;
OPEN cSuppliersGoods;
FETCH NEXT FROM cSuppliersGoods INTO @iSG_ID;
WHILE (@@FETCH_STATUS <> -1)
BEGIN

DECLARE cLog CURSOR LOCAL READ_ONLY FOR
select LOG_FIELD_NAME
from TBL_LOG l
where l.LOG_TBL_NAME = 'TBL_SUPPLIERS_GOODS'
and l.LOG_PK = @iSG_ID
and l.LOG_TYPE = 2
group by LOG_FIELD_NAME
having count(*) > 1;

OPEN cLog;
FETCH NEXT FROM cLog INTO @sLOG_FIELD_NAME;
WHILE (@@FETCH_STATUS <> -1)
BEGIN
DECLARE cLogValues CURSOR LOCAL READ_ONLY FOR
select l.LOG_ID
from TBL_LOG l
where l.LOG_TBL_NAME = 'TBL_SUPPLIERS_GOODS'
and l.LOG_PK = @iSG_ID
and l.LOG_TYPE = 2
and l.LOG_FIELD_NAME = @sLOG_FIELD_NAME
and not l.LOG_ID in (
select TOP 1 l.LOG_ID
from TBL_LOG l
where l.LOG_TBL_NAME = 'TBL_SUPPLIERS_GOODS'
and l.LOG_PK = @iSG_ID
and l.LOG_TYPE = 2
and l.LOG_FIELD_NAME = @sLOG_FIELD_NAME
order by LOG_DATE DESC
)/* FOR UPDATE*/;

OPEN cLogValues;
FETCH NEXT FROM cLogValues INTO @iLOG_ID;
WHILE (@@FETCH_STATUS <> -1)
BEGIN
BEGIN TRY
BEGIN TRANSACTION;
/*
INSERT INTO TBL_LOG_ARCHIVE ([LOG_ID], [LOG_TBL_NAME], [LOG_PK], [LOG_FIELD_NAME], [LOG_OLD_VALUE], [LOG_TBL_CHILD_NAME], [LOG_NEW_VALUE], [LOG_TYPE], [LOG_DATE], [LOG_USER], [LOG_PK_REF_OLD], [LOG_PK_REF_NEW], [LOG_CHILD_PK])
SELECT [LOG_ID], [LOG_TBL_NAME], [LOG_PK], [LOG_FIELD_NAME], [LOG_OLD_VALUE], [LOG_TBL_CHILD_NAME], [LOG_NEW_VALUE], [LOG_TYPE], [LOG_DATE], [LOG_USER], [LOG_PK_REF_OLD], [LOG_PK_REF_NEW], [LOG_CHILD_PK]
FROM TBL_LOG
WHERE LOG_ID = @iLOG_ID;
*/
DELETE FROM TBL_LOG
WHERE LOG_ID = @iLOG_ID;

COMMIT;
END TRY
BEGIN CATCH
ROLLBACK;
END CATCH;

FETCH NEXT FROM cLogValues INTO @iLOG_ID;
END;
CLOSE cLogValues;
DEALLOCATE cLogValues;

FETCH NEXT FROM cLog INTO @sLOG_FIELD_NAME;
END;
CLOSE cLog;
DEALLOCATE cLog;

FETCH NEXT FROM cSuppliersGoods INTO @iSG_ID;
END;
CLOSE cSuppliersGoods;
DEALLOCATE cSuppliersGoods;

FETCH NEXT FROM cSuppliers INTO @iS_ID;
END;
CLOSE cSuppliers;
DEALLOCATE cSuppliers;


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