
- •Лабораторна робота № 1 Тема роботи: Реєстрація та створення баз даних в InterBase.
- •1. Керуюча консоль InterBase.
- •2. Реєстрація бази даних в InterBase.
- •3. Створення бази даних в InterBase.
- •Контрольні запитання
- •Лабораторна робота № 2 Тема роботи: Створення таблиць в базах даних в InterBase.
- •1. Типи даних InterBase.
- •2. Створення таблиці.
- •Контрольні запитання
- •Лабораторна робота № 3 Тема роботи: Введення обмежень в базах даних в InterBase.
- •1. Види обмежень в базі даних.
- •2. Первинний і унікальний ключі.
- •3. Зовнішні ключі.
- •4. Обмеження check
- •5. Вилучення обмежень.
- •Контрольні запитання
- •Лабораторна робота № 4 Тема роботи: Використання генераторів ключів в базах даних в InterBase.
- •Створення генераторів.
- •2. Індекси.
- •Контрольні запитання
- •Лабораторна робота № 5 Тема роботи: Використання тригерів в базах даних в InterBase.
- •Означення тригера.
- •Приклад тригера.
- •3. Контекстні змінні.
- •Контрольні запитання
- •Лабораторна робота № 6 Тема роботи: Безпека в InterBase.
- •1. Користувачі.
- •3. Права.
- •4. Роздача прав.
- •5. Організація користувачі у групи за допомогою ролей.
- •6. Анулювання прав.
- •Контрольні запитання
- •Практична робота № 1 Тема роботи: Використання компоненту Database.
- •З’єднання з сервером
- •Контрольні запитання
- •Практична робота № 2 Тема роботи: Використання головної та підлеглої таблиць InterBase засобами Borland Delphi.
- •Контрольні запитання
- •Практична робота № 3 Тема роботи: Використання механізму транзакцій компонента Database.
- •Керування транзакціями.
- •Контрольні запитання
- •Практична робота № 4 Тема роботи: Використання компонент InterBase Express для підключення до сервера.
- •1. Сервер баз даних InterBase і компоненти InterBase Express
- •2. Механізм доступу до даних InterBase Express
- •3. Компонент tibDatabase.
- •Контрольні запитання
- •Практична робота № 5 Тема роботи: Виконання запитів за допомогою компонента tibDataSet.
- •Вибірка даних з таблиці.
- •2. Редагування даних за допомогою візуальних компонентів.
- •3. Програмне редагування даних.
- •Контрольні запитання
- •Практична робота № 6 Тема роботи: Виконання механізму Master-detail в компонентах tibDataSet.
- •Механізм master-detail.
- •Контрольні запитання
- •Література
Приклад тригера.
Давайте розглянемо простий приклад тригера, що спрацьовує ДО ВСТАВКИ в таблицю і заповнює поле первинного ключа.
CREATE TABLE Table_example (
ID INTEGER NOT NULL,
NAME VARCHAR(80),
PRICE_1 DOUBLE PRECISION,
CONSTRAINT pkTable PRIMARY KEY (ID));
Тут поле ID є первинним ключем і значення цього ключа повинні бути унікальними в межах таблиці. Щоб забезпечити виконання цієї вимоги, створимо генератор і тригер, що буде одержувати значення генератора і підставляти його в таблицю. Таким чином, у полі ID завжди будуть унікальні значення, тому що значення генератора буде збільшуватися щораз при звертанні до тригера. Отже, створюємо генератор:
CREATE GENERATOR GEN_TABLE_EXAMPLE_ID;
І встановлюємо його початкове значення в одиницю:
SET GENERATOR GEN_TABLE_EXAMPLE_ID TO 1;
Тепер необхідно створити тригер. Треба сказати, що тригер, може містити у своєму тілі кілька операторів, розділених крапкою з комою. Тому вам необхідно скористатися командою зміни роздільника команд SET TERM. Ми ж будем наводити тексти тригерів без обрамлення командами зміни роздільника.
Отже, розглянемо текст нашого тригера:
CREATE TRIGGER Table_example_bi
FOR Table_example
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
IF (NEW.ID IS NULL) THEN
NEW.ID = GEN_ID(GEN_TABLE_EXAMPLE_ID,1);
END
Давайте докладно розберемо "будову" тригера.
Опис команди створення тригера починається з ключових слів CREATE TRIGGER, після яких з’являється ім'я тригера – Table_example_bi. Потім слідує ключове слово FOR, після якого зазначене ім'я таблиці, для якої створюється тригер, – Table_example.
На другому рядку команди приводиться опис сутності тригера – ключове слово ACTIVE указує, що тригер є "активним". Тригер також може бути переведений у стан INACTIVE. Це означає, що він буде зберігатися в базі даних, але він не буде спрацьовувати. Сполучення ключових слів BEFORE INSERT визначає, що тригер спрацьовує ДО ВСТАВКИ; а ключове слово POSITION і число 0 указують черговість (позицію) створюваного тригера серед тригерів того ж типу для даної таблиці. Позиція тригера потрібна тому, що в InterBase можливо створити більш 32000 тригерів кожного виду (наприклад, BEFORE INSERT чи AFTER UPDATE), і серверу потрібно вказати, у якому порядку ці тригери будуть виконуватися. Тригери з меншою позицією виконуються першими. Якщо є декілька тригерів з однакової позицією, то вони будуть виконуватися за абеткою.
Усе розглянуте вище до ключового слова AS утворює заголовок тригера. Після AS слідує тіло тригера. Власне в тілі і здійснюється вставка значення в поле первинного ключа. Але спочатку за допомогою вже знайомого вам оператора IF.. .THEN перевіряється, чи не було заповнено це поле на клієнті. Вираз перевірки, що повертає булеву TRUE (істина) чи FALSE (неправда), виглядає так:
NEW.ID IS NULL
Тут NEW – контекстна змінна.
3. Контекстні змінні.
Як уже відмічалося вище, тригер схожий на цензора, що безцеремонно оглядає усе, що відноситься до цікавлячого його предмету. Інтерес нашого тригера описаний сполученням ключових слів BEFORE INSERT – це значить, що всі операції вставки (INSERT) викликають спрацьовування тригера. Причому він спрацює ДО (BEFORE) того, як вставка фізично здійснена. Тобто в момент спрацьовування тригера дані, прислані ким-небудь на вставку, ще не занесені в таблицю. Вони знаходяться в деякому проміжному буфері. І в тригера є можливість звертатися до цього буфера, щоб перевірити і/або змінити значення даних – кандидатів на вставку. Ця можливість реалізована за допомогою контекстної змінної NEW. Можна розглядати цю змінну як структуру (щось подібне struct у Сі чи record у Pascal), елементи якої являють собою значення, прислані для здійснення операції (INSERT у нашому прикладі). Тобто усередині тригера ми можемо звернутися до всіх полів ще не вставленого запису, використовуючи для цього звертання: New.ID, New.NAME і New.PRICE_l.
Ми можемо довідатися значення кожного поля запису, що вставляється, порівняти його чи змінити. Це власне і робиться в цьому фрагменті коду:
IF (NEW.ID IS NULL) THEN
NEW.ID = GEN_ID(GEN_TABLE_EXAMPLE_ID,1);
Спочатку в операторі IF...THEN перевіряємо ідентифікатор ID на наявність якого-небудь значення, адже він може бути згенерований на клієнті. Якщо значенням NEW.ID є NULL, то викликаємо функцію GEN_ID, що збільшує значення генератора GEN_TABLE_EXAMPLE_ID на одиницю і потім повертає отримане число, що привласнюється полю NEW.ID. Таким чином, ми "на льоту" змінили значення в записі, що вставляється!
Крім контекстної змінної NEW, існує її дзеркальний аналог – змінна OLD. На відміну від NEW, OLD містить старі значення запису, що вилучаються чи змінюються. Наприклад, ми можемо використовувати змінну OLD для одержання значень записів, що вилучаються з таблиці:
CREATE TRIGGER Table_example_ad0 FOR Table_example
ACTIVE AFTER DELETE POSITION 0
AS
BEGIN
IF (OLD.id>1000) THEN
BEGIN
/*..виконуємо певні дії..*/
OLD.ID=10;
END
END
Тут ми створюємо тригер, що спрацьовує ПІСЛЯ ВИЛУЧЕННЯ (AFTER DELETE). Як бачите, ми можемо одержати доступ до уже вилучених даних. Звичайно, присвоєння OLD.ID=10; немає жодного змісту – присвоєне значення пропаде на виході з тригера. Однак цей приклад показує, що ми можемо перехопити значення, що вилучаються, і записати, наприклад, у деяку таблицю, де зберігається історія всіх змін.
Використання контекстних змінних часто викликає безліч питань. Справа в тім, що в різних видах тригерів NEW і OLD використовуються по-різному, а в деяких їх узагалі неможливо використовувати. Якщо ми розглянемо тригер у нашому прикладі, то він викликається ДО ВСТАВКИ. Про які значення OLD може йти мова? Адже вставляється зовсім новий запис! І дійсно, контекстна змінна OLD не може бути використана в тригерах BEFORE/AFTER INSERT. А змінна NEW не може бути використана в BEFORE/AFTER DELETE. Обидві ці змінні одночасно можуть бути використані в тригерах BEFORE/AFTER UPDATE, причому змінювати що-небудь можна, тільки використовуючи змінну NEW .
З А В Д А Н Н Я
Всі видані завдання стосуються бази даних Sales, яку ви створили.
Створіть тригер TCUSTOMER_ID для таблиці CUSTOMER, за допомогою якого вставляється в поле Customer_ID значення генератора.
Створіть тригер TITEM_NO для таблиці ITEMS, за допомогою якого вставляється в поле item_No значення генератора.
Оформіть звіт по роботі.