Модераторы: Akella

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание триггера FireBird 2.1 
:(
    Опции темы
Keeper89
Дата 9.4.2010, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: нет
Всего: 58



Доброго времени суток.

Изучаю FireBird, возник вопрос.
Имеется ключевое поле типа VarChar, как можно добавить триггер, чтобы при добавлении записи поле автоматически заполнялось строкой типа
Цитата

ДЕТАЛЬ_0001
ДЕТАЛЬ_0002

и т.д.
?

Заранее спасибо.

З.Ы. Для проектирования базы использую IB/FB Development Studio, Firebird 2.1


+

Еще вопрос: что нужно (установить из инструментов) для полноценного проектирования и разработки БД Firebird (2.1)?  smile 

Это сообщение отредактировал(а) Keeper89 - 9.4.2010, 17:29


--------------------
PM MAIL WWW   Вверх
Gluttton
Дата 9.4.2010, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

Репутация: 7
Всего: 54



Как вариант, можно это сделать как-нибудь так:
Код

/*============================================================*/
/*=== Create DataBase INC.FDB                              ===*/
/*============================================================*/

SET AUTODDL ON;

CONNECT DATABASE 'INC' USER 'SYSDBA' PASSWORD 'masterkey';
DROP DATABASE;

SET SQL DIALECT 3;
SET NAMES WIN1251;
CREATE DATABASE 'INC' USER 'SYSDBA'
PASSWORD 'masterkey' PAGE_SIZE 16384 DEFAULT CHARACTER SET WIN1251;

/*============================================================*/ 
/*=== Create Domains                                       ===*/
/*============================================================*/

CREATE DOMAIN RECORD   AS VARCHAR(50)                 NOT NULL;

/*============================================================*/
/*=== Create Generators                                    ===*/
/*============================================================*/

CREATE GENERATOR INC;

/*============================================================*/
/*=== Create Tables                                        ===*/
/*============================================================*/

CREATE TABLE T
(
    FIELD   RECORD,  -- Master field.
    COMMENT RECORD   -- Some field.

);

/*============================================================*/
/*=== Create Triggers                                      ===*/
/*============================================================*/


SET TERM ^;

CREATE TRIGGER INC
FOR T ACTIVE BEFORE INSERT
POSITION 0 AS
BEGIN
    IF (NEW.FIELD IS NULL)
    THEN NEW.FIELD='SOME_TEXT_'||CAST(GEN_ID (INC, 1) AS VARCHAR(10));
END^

SET TERM ;^

COMMIT;

/*============================================================*/
/*=== Insert data in table T                               ===*/
/*============================================================*/

INSERT INTO T(COMMENT) VALUES ('First record.');
INSERT INTO T(COMMENT) VALUES ('Second record.');

COMMIT;


И тогда:
Код

SELECT * FROM T


Вернёт:
Цитата

FIELD        COMMENT
SOME_TEXT_1  First record.   
SOME_TEXT_2  Second record.



Цитата(Keeper89 @  9.4.2010,  17:10 Найти цитируемый пост)
Еще вопрос: что нужно (установить из инструментов) для полноценного проектирования и разработки БД Firebird (2.1)?


Под Windows я с большим удовольствием использую IB Expert, но, справедливости ради, замечу, что ничего другого и не пробовал smile ...
Под Linux - Flame Robin, немного "покоробило" при переходе с IB Experta, но когда разобрался, то тоже полюбил...
И то и другое бесплатно...

Кроме самого сервера и среды разработки ещё приходилось использовать драйвера (для доступа к БД), но это уже сильно зависит от используемой технологии и решаемых задач...


--------------------
Слава Україні!
PM MAIL   Вверх
Gluttton
Дата 9.4.2010, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

Репутация: 7
Всего: 54



Кроме того можно реализовать логику не в триггере, а  в вычисляемом поле...

К приведенному ниже примеру нужно добавить:

Код

/*============================================================*/
/*=== Create Generators                                    ===*/
/*============================================================*/

...
CREATE GENERATOR MORE_INC;
...

/*============================================================*/
/*=== Create Tables                                        ===*/
/*============================================================*/

CREATE TABLE T
(
    ...
    MORE_FIELD    COMPUTED BY ('SOME_TEXT_'||
                               CAST(GEN_ID (MORE_INC, 1)
                               AS VARCHAR(10)))
);



И тогда запрос на выборку всех данных из таблицы вернёт:
Цитата

FIELD        COMMENT         MORE_FIELD
SOME_TEXT_1  First record.   SOME_TEXT_1  
SOME_TEXT_2  Second record.  SOME_TEXT_2 



--------------------
Слава Україні!
PM MAIL   Вверх
Akella
Дата 9.4.2010, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 20
Всего: 329



Я бы лучше не извращался с таким ключевым полем, а сделал как обычно делают с полем тип int или bigint.

Добавлено через 1 минуту и 56 секунд
а если нужно именно
ДЕТАЛЬ_0001
ДЕТАЛЬ_0002
то добавил бы вычисляемое поле типа varchar, в котором выводил бы результат конкатенации ключа и ДЕТАЛЬ_0...
PM MAIL   Вверх
Keeper89
Дата 10.4.2010, 00:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: нет
Всего: 58



Gluttton, спасибо, а с самого начала что нужно установить?  (я пока только проектирую и ничего не ставил кроме этого проектировщика не ставил).
Цитата(Akella @  9.4.2010,  20:32 Найти цитируемый пост)
Я бы лучше не извращался с таким ключевым полем, а сделал как обычно делают с полем тип int или bigint.

Подумаю, спасибо, думаю и в скорости выиграет.


--------------------
PM MAIL WWW   Вверх
Gluttton
Дата 10.4.2010, 00:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

Репутация: 7
Всего: 54



Цитата(Keeper89 @  10.4.2010,  00:20 Найти цитируемый пост)
Gluttton, спасибо, а с самого начала что нужно установить?

Сервер (СУБД)...
На офф. сайте Firebird можно скачать, для Windows например версию 2.5, и поставить из установщика - там всё очень просто...
При этом, если во время установки не были выбраны настройки при которых СУБД страртует автоматически, то перед тем как начать работать с Firebird, его необходимо запустить. Сделать это можно с помощь одноименного апплета, который появляется в "Панели управления" после установки Firebird...


--------------------
Слава Україні!
PM MAIL   Вверх
Keeper89
Дата 12.4.2010, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: нет
Всего: 58



Цитата(Gluttton @  10.4.2010,  00:50 Найти цитируемый пост)
Сервер (СУБД)...
На офф. сайте Firebird можно скачать, для Windows например версию 2.5, и поставить из установщика - там всё очень просто...

Ага, все установил.

С помощью IBExpert'а задаю генератор и триггер для ID-поля (типа Integer) через закладку AutoIncrement.
Как можно сделать такое же автоматическое добавление поля типа TimeStamp с помощью триггера?


--------------------
PM MAIL WWW   Вверх
Gluttton
Дата 12.4.2010, 12:53 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

Репутация: 7
Всего: 54



Цитата(Keeper89 @  12.4.2010,  12:40 Найти цитируемый пост)
Как можно сделать такое же автоматическое добавление поля типа TimeStamp с помощью триггера?


С трудом понимаю зачем такое нужно, но тем не менее...

Идея в том, что автоинкремента в чистом виде в FireBird нет, а для его реализации используется связка триггер+генератор.
Задача триггера - реагировать на каки-либо события и выполнять определенные действия.
Задача генератора - генерировать последовательности и хранить их последние значения.

Т.о. для реализации автоинкрементного поля применяется следующий алгоритм:
при добавлении новой записи в таблицу вставка значений в поле "автоинкремент" игнорируется (т.о. вставляется значение NULL), триггер "отлавливает" событие попытки вставить значение NULL в поле "автоинкремент" и выполняет следующее: берет значение некоторого генератора, прибавляет к нему указанную величину (как правило это 1), и полученное значение вставляет в поле.

В примере с вставкой пронумерованных деталей я приведенный пример нескользо изменил, и в качестве вставляемого значения использовал результат конкатенации литерала (SOME_TEXT) и приведенное к текстовому типу значение генератора.

Для автоинкремента временнЫх типов необходимо выполнять какую то логику в триггере...
Ну например, если мы хотим, что бы каждая последующая запись была больше предыдущей на секунду, то в триггере нужно реализовать функцию, которая к начальному времени (констранта) будет добавлять значение генератора...

Как то так...


--------------------
Слава Україні!
PM MAIL   Вверх
Keeper89
Дата 12.4.2010, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: нет
Всего: 58



Цитата(Gluttton @  12.4.2010,  12:53 Найти цитируемый пост)
С трудом понимаю зачем такое нужно, но тем не менее...


Цитата(Gluttton @  12.4.2010,  12:53 Найти цитируемый пост)
Для автоинкремента временнЫх типов необходимо выполнять какую то логику в триггере...

Нет, нет, я наверное неправильно сформулировал. Нужно просто автоматически добавлять дату вставки записи.


--------------------
PM MAIL WWW   Вверх
Gluttton
Дата 12.4.2010, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

Репутация: 7
Всего: 54



Цитата(Keeper89 @  12.4.2010,  13:06 Найти цитируемый пост)
Нет, нет, я наверное неправильно сформулировал. Нужно просто автоматически добавлять дату вставки записи. 


Ну дык, проще не бывает - при создании таблицы, для поля указать значение по умолчанию (default) current_timestamp...


--------------------
Слава Україні!
PM MAIL   Вверх
Keeper89
Дата 12.4.2010, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: нет
Всего: 58



Цитата(Gluttton @  12.4.2010,  13:16 Найти цитируемый пост)
Ну дык, проще не бывает - при создании таблицы, для поля указать значение по умолчанию (default) current_timestamp... 

Спасибо  smile 

Еще вопрос: для ID-генератора использую такой код триггера (он создается в эксперте самостоятельно):
Код

AS
BEGIN
  IF (NEW.PRODUCTID IS NULL) THEN
    NEW.PRODUCTID = GEN_ID(GEN_PRODUCT_ID,1);
END

Он верно генерирует следующий номер, но проблема в том, что если удалить строку (например последнюю), то генерироваться будет номер как будто она не была удалена и получается:
Цитата

1
2
3
5

Где последний номер = 5 вместо 4. Такое же наблюдается для всех удаленных строк.
Можно исправить генератор таким образом, чтобы он выдавал первое незанятое число или нет? Может не стоит это дело по каким-то соображениям?


--------------------
PM MAIL WWW   Вверх
Gluttton
Дата 12.4.2010, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

Репутация: 7
Всего: 54



Цитата(Keeper89 @  12.4.2010,  15:26 Найти цитируемый пост)
Он верно генерирует следующий номер, но проблема в том, что если удалить строку (например последнюю), то генерироваться будет номер как будто она не была удалена и получается:


Не ленимся и читаем мой пост про то как работают генераторы, а лучше по ссылкам в googl'e на вопрос "автоинкремент Firebird"...

Генератору совершенно всё-равно, что там у нас в таблицах твориться: удаляли ли мы записи или же не удаляли. Он (генератор) помнит лишь своё значение, а так же по нашей команде увеличивает его (или же уменьшает) на заданную величину.

Цитата(Keeper89 @  12.4.2010,  15:26 Найти цитируемый пост)
Можно исправить генератор таким образом, чтобы он выдавал первое незанятое число или нет? Может не стоит это дело по каким-то соображениям?


Необходимости в исключении "пропусков" ключевого поля нет. 
Изменить генератор я думаю нельзя, проще уже написать триггер, который бы при вставке значений в таблицу проверял бы "пропущенные" номера и выдавал их, но практической пользы в этом (в общем случае) нет.


--------------------
Слава Україні!
PM MAIL   Вверх
Keeper89
Дата 12.4.2010, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: нет
Всего: 58



Цитата(Gluttton @  12.4.2010,  17:12 Найти цитируемый пост)
Не ленимся и читаем мой пост про то как работают генераторы, а лучше по ссылкам в googl'e на вопрос "автоинкремент Firebird"...

Почитал, решил что после тестов сброшу генератор и удалю прошлые записи для чистоты эксперимента smile

Спасибо


--------------------
PM MAIL WWW   Вверх
Gluttton
Дата 12.4.2010, 20:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

Репутация: 7
Всего: 54



Цитата(Keeper89 @  12.4.2010,  20:07 Найти цитируемый пост)
Почитал, решил что после тестов сброшу генератор и удалю прошлые записи для чистоты эксперимента smile


Я например, для чистоты экспериментов smile , вообще удаляю БД и создаю заново (так как в моем первом посте) это позволяет избежать множиства "неожиданностей" на этапе разработки...

Цитата(Keeper89 @  12.4.2010,  20:07 Найти цитируемый пост)
Спасибо 

Всегда пожалуйста smile ...


--------------------
Слава Україні!
PM MAIL   Вверх
Keeper89
Дата 12.4.2010, 23:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: нет
Всего: 58



Цитата(Gluttton @  12.4.2010,  20:15 Найти цитируемый пост)
вообще удаляю БД и создаю заново

Ну это как-то совсем брутально, все поля и связи и т.д. восстанавливать... smile


--------------------
PM MAIL WWW   Вверх
Данкинг
Дата 12.4.2010, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 1
Всего: 130



Цитата(Keeper89 @  13.4.2010,  00:26 Найти цитируемый пост)
Ну это как-то совсем брутально, все поля и связи и т.д. восстанавливать... 

Для этого метаданные есть. smile 


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
Gluttton
Дата 12.4.2010, 23:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

Репутация: 7
Всего: 54



Цитата(Keeper89 @  12.4.2010,  23:26 Найти цитируемый пост)
Ну это как-то совсем брутально, все поля и связи и т.д. восстанавливать... smile


А для этого БД нужно создавать не "мышкованием", а скриптом и тогда внеся на определенном этапе незначительное изменение можно "перепостроить" БД за несколько секунд, а то и меньше smile ...

Я начинал с "мышкования" и бывало очень обидно, когда несколько дней творишь, а потом из-за неудачной операции приходиться создавать всё заново и опять в ручную...

Так что скрипты рулят! Рекомендую сразу начинать работу с них, тем более, что там особо сложного ничего нет - на пару дней разобраться.

Плюс, чётко представляешь, что в БД реализовано, а что нет никаких тебе "закулисных" IDE'ешных реализаций...


--------------------
Слава Україні!
PM MAIL   Вверх
Keeper89
Дата 13.4.2010, 00:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: нет
Всего: 58



Цитата(Gluttton @  12.4.2010,  23:55 Найти цитируемый пост)
Так что скрипты рулят! Рекомендую сразу начинать работу с них, тем более, что там особо сложного ничего нет - на пару дней разобраться.

А где про них можно почитать? И как вообще выглядит этот процесс (в том же IBExpert'е, например)?

Это сообщение отредактировал(а) Keeper89 - 13.4.2010, 00:55


--------------------
PM MAIL WWW   Вверх
Gluttton
Дата 13.4.2010, 01:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

Репутация: 7
Всего: 54



Цитата(Keeper89 @  13.4.2010,  00:55 Найти цитируемый пост)
А где про них можно почитать?

Firebird Хелен Борри, там и про скрипты и про всё остальное...

Цитата(Keeper89 @  13.4.2010,  00:55 Найти цитируемый пост)
И как вообще выглядит этот процесс (в том же IBExpert'е, например)?

На панельке пиктограммка в виде странички с шестеренкой позволяет открывать, редактировать и выполнять файлы скриптов (текстовые файлы с расширением *.sql).



--------------------
Слава Україні!
PM MAIL   Вверх
former
Дата 13.4.2010, 08:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MEMS Expert
***


Профиль
Группа: Завсегдатай
Сообщений: 1166
Регистрация: 1.3.2006
Где: Россия

Репутация: 1
Всего: 17



Цитата(Gluttton @  12.4.2010,  23:55 Найти цитируемый пост)
начинал с "мышкования" и бывало очень обидно, когда несколько дней творишь, а потом из-за неудачной операции приходиться создавать всё заново и опять в ручную...

Согласен, скрипты хорошо использовать вначале, когда хочешь изучить работу с СУБД.
Gluttton, но ведь в IBExpert есть замечательная функция "Извлечение метаданных". 



Это сообщение отредактировал(а) former - 13.4.2010, 08:49


--------------------
Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами.
PM MAIL   Вверх
Gluttton
Дата 13.4.2010, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начинающий
***


Профиль
Группа: Завсегдатай
Сообщений: 1170
Регистрация: 28.8.2008
Где: Феодосия

Репутация: 7
Всего: 54



Цитата(former @  13.4.2010,  08:42 Найти цитируемый пост)
Gluttton, но ведь в IBExpert есть замечательная функция "Извлечение метаданных". 

Хм... Об этом я как то не подумал... В принципе да, можно и так...


--------------------
Слава Україні!
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Interbase"
Alex

Обязательно указание:

1. Версию InterBase (Firebird, Yaffil)

2. Способа доступа (ADO, BDE, IBX и т.д.)

  • КАК ПРАВИЛЬНО ОФОРМИТЬ КОД - ЗДЕСЬ
  • КАК ПРАВИЛЬНО УКАЗАТЬ ТЕКСТ ОШИБКИ - ЗДЕСЬ
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • FAQ раздела лежит здесь!

Если Вам понравилась атмосфера форума, заходите к нам чаще! С Уважением, Akella.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Firebird, Interbase | Следующая тема »


 




[ Время генерации скрипта: 0.1223 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.