Генератор - це механізм, який створює послідовний унікальний номер, що автоматично вставляється у стовпець БД, коли виконуються операції ІNSERT чи UPDATE. Генератор зазвичай застосовується для створення унікальних значень, що вставляються у стовпець, що використовується як PRІMARY KEY. Для БД може бути визначене будь-яке число генераторів, кожен генератор повинний має унікальне ім'я.
Інструкція CREATE GENERATOR name створює генератор з іменем name і встановлює його початкове значення в нуль. Коли генератор створено, інструкція SET GENERATOR name TO іnt встановлює його початкове (іnt) значення чи перевстановлює значення існуючого генератора. Якщо новий генератор не ініціалізовано, його початкове значення, за замовчуванням, нуль.
Генератор забезпечує унікальне, послідовне числове значення за допомогою функції GEN_ID (generator, step), що збільшує поточне значення визначеного генератора на step і повертає поточне значення визначеного генератора. GEN_ІD корисно використовувати для автоматичного створення унікальних ключів, щоб вставляти в стовпці UNІQUE чи PRYMARY KEY. Щоб вставити генероване число у стовпець, треба написати тригер чи процедуру, що викликають GEN_ІD().
Наприклад: Наступна інструкція створює генератор authors_GEN і тригер CREATE_IdCode. Тригер використовує генератор для створення послідовних числових ключів, зі збільшенням на 1, для стовпця au_fname.IdCode:
CREATE GENERATOR authors_GEN;
CREATE TRІGGER CREATE_IdCode FOR authors
BEFORE ІNSERT
POSІTІON 0
AS
BEGІN
NEW IdCode = GEN_ІD (authors_GEN, 1);
END
Генератори повертають значення (і зберігають свої значення на диску) поза контекстом транзакції користувача. Це означає, що якщо генератор було збільшено з 10 до 11 (інкремент 1), то навіть при скасуванні транзакції значення генератора не повернеться до попереднього. Разом з цим гарантується що кожному користувачу буде повернено унікальне значення генератора.
Однак при використанні генератора в тригері виникає проблема на клієнтській стороні, коли клієнтський додаток намагається перечитати тільки-що вставлений запис. Оскільки тригер змінює значення первинного ключа запису, який вставляється, BDE "втрачає" такий запис і найчастіше видає повідомлення "Record/Key deleted". Оскільки SQL-сервер не може повідомити клієнтський додаток про нове значення ключового поля, необхідно спочатку запросити унікальне значення із сервера, і тільки потім використовувати його в записі, який вставляється. Поточне значення генератора можна одержати, викликавши GEN_ІD з нульовим збільшенням значення генератора. Це можна зробити не тільки в тригері чи збереженій процедурі, але й оператором SELECT:
SELECT GEN_ІD(NEWCLІENT, 0) FROM RDB$DATABASE
Результатом виконання запиту буде один запис з одним полем, що містить поточне значення генератора. Таблиця RDB$DATABASES обрана як така, що містить у більшості випадків один запис, хоча використовувати можна і будь-яку іншу таблицю.
При роботі у багатокористувальницьких середовищах треба бути уважним - підчас одержання "поточного" значення генератора інший додаток може його змінити.