Вопрос № 57526: как наиболее оптимально организовать работу с БД InterBase? Оправдано ли использование хранимых процедур для записи первичного ключа при Insert-е? Допустимо ли использование большого количества компонентов TTransaction (своя для каждой хранимой проце...
Вопрос № 57.526
как наиболее оптимально организовать работу с БД InterBase? Оправдано ли использование хранимых процедур для записи первичного ключа при Insert-е? Допустимо ли использование большого количества компонентов TTransaction (своя для каждой хранимой процедуры)? Существуют ли какие-то общие схемы работы с транзакциями, наборами данных и хранимыми процедурами?
Очень хотелось бы посмотреть пример.... Заранее спасибо!
Отправлен: 03.10.2006, 09:51
Вопрос задал: Kotsa (статус: Посетитель)
Всего ответов: 2 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: sir henry
Здравствуйте, Kotsa!
1, 2. Начнем с того, что первичный ключ не записывают при вставке. Вы вставляете некое значение, которое обеспечивает уникальность Вашей строке для все таблицы. Если значение не уникальное, то выбрасывается ошибка. Естественно, что вставка подобного значения должна быть именно внутри базы, чтобы никакие пользователи не имели доступ к этому значению, во избежание порчи данных. Засунуть вставку значения уникальности в хранимую процедуру - это самый хороший вариант.
Еще, для генерации уникального значения для первичного ключа, лучше всего использовать такое средство InterBase, как генератор.
3, 4. Вы, для начала, определитесь, какие операции будут проводиться в базе. Чем меньшим количеством компонентов Вы сможете обойтись, тем лучше. Однако и не забывая, что транзакции обеспечивают целостность данных.
Обычно в одну транзакцию запихивается одна операция. Если несколько, то это должны быть однозначно связанные операции, непроведение одной из которых, ставит под сомнение проведение любой из них.
***************
Вам просто необходимо зайти на сайт http://www.ibase.ru, который содержит громадное количество документации по работе с InterBase/FireBird и там Вы прочтете более подробно об интересующих Вас вопросах. С примерами.
Ответ отправил: sir henry (статус: Академик) Россия, Красноярск ---- Ответ отправлен: 03.10.2006, 10:26
Отвечает: Проходящий Мимо
Здравствуйте, Kotsa!
Вообще-то лучше использовать не хранимые процедуры, а тригеры. Тригеры - объекты, которые срабатывают при каком-то событии в таблице.
Вам нужен тригер before insert (после вставки):
CREATE trigger tableNN_bi0 for tableNN
active before insert position 0
AS
begin
if (new.ID is NULL) then new.id=GEN_ID(GEN_TABLENN_ID, 1);
end
Вместе с тригером задействуем генератор GEN_TABLENN_ID, который хранит значение первичного ключа. Вместе с этим можно использовать возможности, которые заложены во многих компонентах для работы с InterBase, например IBDataSet с закладки палитры InterBase. Нужно заполнить свойство GeneratorField, тогда компонент берет на себя работу по заполнению ключевого поля. Но работа через тригеры предпочтительней, тогда у Вас будут развязаны руки при добавлении значений в таблицу через хранимые процедуры и тригеры, а также
при работе с представлениями. Удачи!
--------- Carpe diem!
Ответ отправил: Проходящий Мимо (статус: 7-ой класс)
Ответ отправлен: 03.10.2006, 11:20