Физическое удаление данных из таблицы БД
При удалении записей из таблицы БД они удаляются не физически, а логически помечаются удаленными. Т.е. при большом количестве операций вставки удаления с БД таблица разрастается. И это понятно.
В Database Desktop есть опция "Pack Table", которая позволяет физически удалить неиспользуемые записи, оставив неудаленные (в отличие, например, от метода EmptyTable() компонента TDataSet, который удаляет все).
Так вот суть вопроса: как сделать то же самое только из кода программы?
Заранее благодарен.
P.S. Естественно без извращений типа создать новую таблицу того же типа, в которую скопировать содержимое старой, а старую удалить (этакая рокировка).
Цитата:
Originally posted by OS17
Такая задачка:
При удалении записей из таблицы БД они удаляются не физически, а логически помечаются удаленными. Т.е. при большом количестве операций вставки удаления с БД таблица разрастается. И это понятно.
В Database Desktop есть опция "Pack Table", которая позволяет физически удалить неиспользуемые записи, оставив неудаленные (в отличие, например, от метода EmptyTable() компонента TDataSet, который удаляет все).
Так вот суть вопроса: как сделать то же самое только из кода программы?
Заранее благодарен.
P.S. Естественно без извращений типа создать новую таблицу того же типа, в которую скопировать содержимое старой, а старую удалить (этакая рокировка).
Такая задачка:
При удалении записей из таблицы БД они удаляются не физически, а логически помечаются удаленными. Т.е. при большом количестве операций вставки удаления с БД таблица разрастается. И это понятно.
В Database Desktop есть опция "Pack Table", которая позволяет физически удалить неиспользуемые записи, оставив неудаленные (в отличие, например, от метода EmptyTable() компонента TDataSet, который удаляет все).
Так вот суть вопроса: как сделать то же самое только из кода программы?
Заранее благодарен.
P.S. Естественно без извращений типа создать новую таблицу того же типа, в которую скопировать содержимое старой, а старую удалить (этакая рокировка).
Если ты используешь Paradox или что-то подобное, то не знаю. ДЛя SQL БД существует Backup-Restore.
Но лучше всего это делать ручками с резервным копированием а не из программы - меньше шансов получить упавшую базу.
Я понимаю, что в SQL есть такое средство. Если бы я работал с солидной БД на том же Oracle, то там, например, пришлось бы писать что то вроде процедуры PL/SQL.
В конце концов резервирование всегда можно сделать и из программы. Кроме того резервирование не всегда возможно. Представь таблицу на мегабайт 200-300. А если вопрос времени не маловажен. А если их 10 и не к каждой можно подлезть со средствами администрирования, а учить USERов дело неблагодарное?
К тому же любое встороенное средство, в конце то концов есть тоже программа.
причем в во входном параметре нужно указать
TblDesc.bPack = true;
хотя, она все равно создает временный файл (и не думаю что он будет меньшего размера) - точно также как это делает Desktop (очень даже подозреваю что он выполнен на nой же библиотеке Dbi функций)
Может быть кинешь какой нибудь пример.
И еще в стандартном примере Helpa на эту функцию есть упоминание некой функции Chk(), которая компилятором не переваривается.
Вообщем резюме: чего то не идет, хотя судя по всему должно! Причина мне не понятна. Если только дело в прокладке между стулом и клавиатурой.
Работаю с DBase. У меня проходит.
---
Table1->Close();
Table1->Exclusive=true;
Table1->Open();
DbiPackTable(Table1->DBHandle,Table1->Handle, NULL,NULL,true);
---
для ОS17 - Вышли мыло
Мой e-mail: [EMAIL=os17@mail.ru]os17@mail.ru[/EMAIL] .
Не хочет выполнять и такой код. Пересовокуплял его в различных позах с тем, что знал - бестолку. Но вот вопрос : нужно ли открывать БД и смысл ее открытия в эксклюзивном режиме именно для этого случая. Далее : чем отличаетс DBHandle от просто Handle.