![]() |
Модераторы: Akella |
![]() ![]() ![]() |
|
Keeper89 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2580 Регистрация: 26.2.2009 Репутация: нет Всего: 58 |
Доброго времени суток.
Изучаю FireBird, возник вопрос. Имеется ключевое поле типа VarChar, как можно добавить триггер, чтобы при добавлении записи поле автоматически заполнялось строкой типа
и т.д. ? Заранее спасибо. З.Ы. Для проектирования базы использую IB/FB Development Studio, Firebird 2.1 + Еще вопрос: что нужно (установить из инструментов) для полноценного проектирования и разработки БД Firebird (2.1)? ![]() Это сообщение отредактировал(а) Keeper89 - 9.4.2010, 17:29 |
|||
|
||||
Gluttton |
|
||||||||
![]() Начинающий ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1170 Регистрация: 28.8.2008 Где: Феодосия Репутация: 7 Всего: 54 |
Как вариант, можно это сделать как-нибудь так:
И тогда:
Вернёт:
Под Windows я с большим удовольствием использую IB Expert, но, справедливости ради, замечу, что ничего другого и не пробовал ![]() Под Linux - Flame Robin, немного "покоробило" при переходе с IB Experta, но когда разобрался, то тоже полюбил... И то и другое бесплатно... Кроме самого сервера и среды разработки ещё приходилось использовать драйвера (для доступа к БД), но это уже сильно зависит от используемой технологии и решаемых задач... -------------------- Слава Україні! |
||||||||
|
|||||||||
Gluttton |
|
||||
![]() Начинающий ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1170 Регистрация: 28.8.2008 Где: Феодосия Репутация: 7 Всего: 54 |
Кроме того можно реализовать логику не в триггере, а в вычисляемом поле...
К приведенному ниже примеру нужно добавить:
И тогда запрос на выборку всех данных из таблицы вернёт:
-------------------- Слава Україні! |
||||
|
|||||
Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 20 Всего: 329 |
Я бы лучше не извращался с таким ключевым полем, а сделал как обычно делают с полем тип int или bigint.
Добавлено через 1 минуту и 56 секунд а если нужно именно ДЕТАЛЬ_0001 ДЕТАЛЬ_0002 то добавил бы вычисляемое поле типа varchar, в котором выводил бы результат конкатенации ключа и ДЕТАЛЬ_0... |
|||
|
||||
Keeper89 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2580 Регистрация: 26.2.2009 Репутация: нет Всего: 58 |
Gluttton, спасибо, а с самого начала что нужно установить? (я пока только проектирую и ничего не ставил кроме этого проектировщика не ставил).
Подумаю, спасибо, думаю и в скорости выиграет. |
|||
|
||||
Gluttton |
|
|||
![]() Начинающий ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1170 Регистрация: 28.8.2008 Где: Феодосия Репутация: 7 Всего: 54 |
Сервер (СУБД)... На офф. сайте Firebird можно скачать, для Windows например версию 2.5, и поставить из установщика - там всё очень просто... При этом, если во время установки не были выбраны настройки при которых СУБД страртует автоматически, то перед тем как начать работать с Firebird, его необходимо запустить. Сделать это можно с помощь одноименного апплета, который появляется в "Панели управления" после установки Firebird... -------------------- Слава Україні! |
|||
|
||||
Keeper89 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2580 Регистрация: 26.2.2009 Репутация: нет Всего: 58 |
Ага, все установил. С помощью IBExpert'а задаю генератор и триггер для ID-поля (типа Integer) через закладку AutoIncrement. Как можно сделать такое же автоматическое добавление поля типа TimeStamp с помощью триггера? |
|||
|
||||
Gluttton |
|
|||
![]() Начинающий ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1170 Регистрация: 28.8.2008 Где: Феодосия Репутация: 7 Всего: 54 |
С трудом понимаю зачем такое нужно, но тем не менее... Идея в том, что автоинкремента в чистом виде в FireBird нет, а для его реализации используется связка триггер+генератор. Задача триггера - реагировать на каки-либо события и выполнять определенные действия. Задача генератора - генерировать последовательности и хранить их последние значения. Т.о. для реализации автоинкрементного поля применяется следующий алгоритм: при добавлении новой записи в таблицу вставка значений в поле "автоинкремент" игнорируется (т.о. вставляется значение NULL), триггер "отлавливает" событие попытки вставить значение NULL в поле "автоинкремент" и выполняет следующее: берет значение некоторого генератора, прибавляет к нему указанную величину (как правило это 1), и полученное значение вставляет в поле. В примере с вставкой пронумерованных деталей я приведенный пример нескользо изменил, и в качестве вставляемого значения использовал результат конкатенации литерала (SOME_TEXT) и приведенное к текстовому типу значение генератора. Для автоинкремента временнЫх типов необходимо выполнять какую то логику в триггере... Ну например, если мы хотим, что бы каждая последующая запись была больше предыдущей на секунду, то в триггере нужно реализовать функцию, которая к начальному времени (констранта) будет добавлять значение генератора... Как то так... -------------------- Слава Україні! |
|||
|
||||
Keeper89 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2580 Регистрация: 26.2.2009 Репутация: нет Всего: 58 |
||||
|
||||
Gluttton |
|
|||
![]() Начинающий ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1170 Регистрация: 28.8.2008 Где: Феодосия Репутация: 7 Всего: 54 |
Ну дык, проще не бывает - при создании таблицы, для поля указать значение по умолчанию (default) current_timestamp... -------------------- Слава Україні! |
|||
|
||||
Keeper89 |
|
||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2580 Регистрация: 26.2.2009 Репутация: нет Всего: 58 |
Спасибо ![]() Еще вопрос: для ID-генератора использую такой код триггера (он создается в эксперте самостоятельно):
Он верно генерирует следующий номер, но проблема в том, что если удалить строку (например последнюю), то генерироваться будет номер как будто она не была удалена и получается:
Где последний номер = 5 вместо 4. Такое же наблюдается для всех удаленных строк. Можно исправить генератор таким образом, чтобы он выдавал первое незанятое число или нет? Может не стоит это дело по каким-то соображениям? |
||||||
|
|||||||
Gluttton |
|
|||
![]() Начинающий ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1170 Регистрация: 28.8.2008 Где: Феодосия Репутация: 7 Всего: 54 |
Не ленимся и читаем мой пост про то как работают генераторы, а лучше по ссылкам в googl'e на вопрос "автоинкремент Firebird"... Генератору совершенно всё-равно, что там у нас в таблицах твориться: удаляли ли мы записи или же не удаляли. Он (генератор) помнит лишь своё значение, а так же по нашей команде увеличивает его (или же уменьшает) на заданную величину.
Необходимости в исключении "пропусков" ключевого поля нет. Изменить генератор я думаю нельзя, проще уже написать триггер, который бы при вставке значений в таблицу проверял бы "пропущенные" номера и выдавал их, но практической пользы в этом (в общем случае) нет. -------------------- Слава Україні! |
|||
|
||||
Keeper89 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2580 Регистрация: 26.2.2009 Репутация: нет Всего: 58 |
||||
|
||||
Gluttton |
|
|||
![]() Начинающий ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1170 Регистрация: 28.8.2008 Где: Феодосия Репутация: 7 Всего: 54 |
Я например, для чистоты экспериментов ![]() Всегда пожалуйста ![]() -------------------- Слава Україні! |
|||
|
||||
Keeper89 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2580 Регистрация: 26.2.2009 Репутация: нет Всего: 58 |
Ну это как-то совсем брутально, все поля и связи и т.д. восстанавливать... ![]() |
|||
|
||||
Данкинг |
|
|||
![]() Yersinia pestis ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 8302 Регистрация: 7.11.2006 Где: მოსკოვი Репутация: 1 Всего: 130 |
Для этого метаданные есть. ![]() -------------------- There's nothing left but silent epitaphs. |
|||
|
||||
Gluttton |
|
|||
![]() Начинающий ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1170 Регистрация: 28.8.2008 Где: Феодосия Репутация: 7 Всего: 54 |
А для этого БД нужно создавать не "мышкованием", а скриптом и тогда внеся на определенном этапе незначительное изменение можно "перепостроить" БД за несколько секунд, а то и меньше ![]() Я начинал с "мышкования" и бывало очень обидно, когда несколько дней творишь, а потом из-за неудачной операции приходиться создавать всё заново и опять в ручную... Так что скрипты рулят! Рекомендую сразу начинать работу с них, тем более, что там особо сложного ничего нет - на пару дней разобраться. Плюс, чётко представляешь, что в БД реализовано, а что нет никаких тебе "закулисных" IDE'ешных реализаций... -------------------- Слава Україні! |
|||
|
||||
Keeper89 |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2580 Регистрация: 26.2.2009 Репутация: нет Всего: 58 |
А где про них можно почитать? И как вообще выглядит этот процесс (в том же IBExpert'е, например)? Это сообщение отредактировал(а) Keeper89 - 13.4.2010, 00:55 |
|||
|
||||
Gluttton |
|
|||
![]() Начинающий ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1170 Регистрация: 28.8.2008 Где: Феодосия Репутация: 7 Всего: 54 |
Firebird Хелен Борри, там и про скрипты и про всё остальное...
На панельке пиктограммка в виде странички с шестеренкой позволяет открывать, редактировать и выполнять файлы скриптов (текстовые файлы с расширением *.sql). -------------------- Слава Україні! |
|||
|
||||
former |
|
|||
![]() MEMS Expert ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1166 Регистрация: 1.3.2006 Где: Россия Репутация: 1 Всего: 17 |
Согласен, скрипты хорошо использовать вначале, когда хочешь изучить работу с СУБД. Gluttton, но ведь в IBExpert есть замечательная функция "Извлечение метаданных". Это сообщение отредактировал(а) former - 13.4.2010, 08:49 -------------------- Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами. |
|||
|
||||
Gluttton |
|
|||
![]() Начинающий ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1170 Регистрация: 28.8.2008 Где: Феодосия Репутация: 7 Всего: 54 |
Хм... Об этом я как то не подумал... В принципе да, можно и так... -------------------- Слава Україні! |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Interbase" | |
|
Обязательно указание: 1. Версию InterBase (Firebird, Yaffil) 2. Способа доступа (ADO, BDE, IBX и т.д.)
Если Вам понравилась атмосфера форума, заходите к нам чаще! С Уважением, Akella. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Firebird, Interbase | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |