cvaleriy, можно. транзакции для этого и существуют. вопрос в следующем: если данные добавляются единовременно, то однозначно стоит это делать в рамках одной транзакции, а вот если они добавляются по одной штуке в течении дня, то держать весь день открытой транзакцию не стоит, лучше всего стартовать и закрывать её сразу, на одну вставку.
со вторым вариантом, я думаю, и так всё понятно, остановлюсь вкратце на первом, а именно - единовременная вставка нескольких записей.
существует два способа:
1. делать всё на уровне клиента
здесь всё зависит от среды разработки. в дельфи/билдере есть стандартные компоненты, TIbTransaction, у которых есть методы StartTransaction, Commit и RollBack. начиная с версии 6.0 появились методы CommitRetaining и RollBackRetaining. они делают то же самое, что и их аналоги, но "с сохранением контекста существующей транзакции". если Commit и RollBack, фактически, закрывают транзакцию (после их вызова придётся переоткрывать заново таблицы, т.к. они окажуться закрытыми), то XXXRetaining внесёт данные и оставит транзакцию запущенной. соответственно, переоткрывать ничего не придётся. у этого есть свой минус: если у вставляемой записи, к примеру, заданы дефолтовые значения (которые заполняются на уровне сервера, клиент о них не имеет понятия), то после вставки и вызова CommitRetaining эти значения попадут в базу, но в клиенте
не будут видны. а вот при использовании обычного Commit - это исключено, т.к. после него придётся переоткрыть таблицу, что приведёт к автоматическому (или ручному) запуску новой транзакции, которая зацепит все данные, в т.ч. и те, что были внесены на стороне сервера. то же самое можно сказать и про триггера: если они меняют какие-то данные, при вызове CommitRetaining эти данные не отобразяться. всё это справедливо не только для дельфей и билдера, это стандартные функции интербейсовского api, которые работают одинаково в любых средах.
а что касается дельфей, то там это выглядит примерно так:
IbTransaction.StartTransaction;
try
IbTable1.Insert;
...
IbTable1.Post;
IbTransaction.Commit;
except
IbTransaction.Rollback;
end;
при необходимости можно вставить команды на старт новой транзакции и открытие таблицы, т.к. после вызова Commit она будет закрыта, либо, если струткура базы позволяет, использовать CommitRetainnig.
2. делать всё на уровне сервера, т.е. средствами sql.
это означает, что ты формируешь огромадный (относительно, конечно) скрипт, вида:
set transaction ...
exec sql ...
commit ...
и выполняешь его на сервере. учитывая твои объёмы данных, мне кажется, это не самый умный вариант, я бы выбрал первый