- •Модуль 1 Тема 1. Вступ до sql. Синтаксис sql. Типи даних.
- •1. Вступ до sql.
- •Функції sql:
- •Роль sql
- •Переваги sql:
- •Синтаксис sql.
- •Типи даних.
- •1.3.1. Команди
- •1.3.2. Імена
- •1.3.3. Типи даних
- •1.3.4. Константи
- •1.3.4.1. Числові константи
- •1 .3.4.2. Літерні рядки
- •1.3.4.3. Константи дати і часу
- •1.3.4.4. Іменовані константи
- •1.3.5. Вирази
- •1.3.6. Вбудовані функції
- •Тема 2. Створення баз даних
- •Мова визначення даних
- •2. Створення бази даних
- •Тема 3. Створення таблиць
- •1. Команда створення таблиці.
- •2. Заборона значення null за допомогою обмеження not null
- •Тема 4. Вставка стрічок з допомогою оператора insert. Вилучення стрічок з допомогою оператора delete, редагування стрічки з допомогою команди update.
- •Вставка рядків за допомогою команди insert.
- •Додавання рядка за допомогою положення стовпця
- •Додавання рядка за допомогою назв стовпців
- •Додавання рядків з однієї таблиці в іншу
- •Зміна рядків за допомогою команди update.
- •Зміна рядків
- •Видалення рядків за допомогою команди delete
- •Видалення рядків
- •Тема 5. Оператор select
- •Оператор select.
- •Обчислювальні стовпчики. Альтернативне ім’я стовпчику.
- •Порівняння значення стовпчика із константою
- •Правила виконання однотабличних запитів на вибірку
- •Тема 6. Комбінування умов з допомогою операторів and, or, not. Порівняння по шаблону. Порівняння з діапазоном. Сортування стрічок з допомогою речення order by.
- •Порівняння значень виразів має наступну синтаксичну діаграму:
- •Тема 7. Створення псевдонімів. З’єднання таблиці із собою. Вибір даних з кількох таблиць
- •1. Створення псевдонімів.
- •2. З’єднання таблиці із собою.
- •3. Просте з’єднання таблиць (з’єднання за рівністю)
- •Запити з використанням відношення „головна – підлегла” таблиці (предок – нащадок)
- •3. Запити на вибірку до трьох і більше таблиць
- •4. Запити на об’єднання
- •Тема 8. Введення обмежень в базах даних
- •1. Види обмежень в базі даних.
- •Основні принципи роботи з обмеженнями
- •Присвоєння назви обмеженню
- •2. Первинний і унікальний ключі.
- •3. Зовнішні ключі.
- •4. Обмеження check
- •5. Вилучення обмежень.
- •Тема 9. Використання збережуваних процедур в базах даних. Використання генераторів ключів у базах даних в InterBase. Використання тригерів у базах даних.
- •1. Визначення збережуваної процедури.
- •1.2. Цикли й оператори розгалуження.
- •2. Створення генераторів.
- •2.1. Індекси.
- •2.2. Обробка виключень і помилок.
- •3. 1.Означення тригера.
- •3.2. Приклад тригера.
- •3.3. Контекстні змінні.
- •Тема 10. Безпека в базах даних
- •1. Користувач InterBase.
- •3. Організація користувачі у групи за допомогою ролей.
- •4. Права. Роздача прав.
- •5. Анулювання прав.
- •Модуль 2 Тема 11. Оператор exists. Сумування і групування даних.
- •1.1. Оператор exists.
- •1.2. Використання exists з співвіднесеними підзапитами.
- •1.3. Комбінація оператора exists і з’єднання.
- •1.4. Використання not exists.
- •1.5. Використання складних підзаписів з оператором exists.
- •2.1. Агрегатні (статистичні) функції
- •2.2. Правила опрацювання значення null агрегатними функціями:
- •2.3.Опрацювання унікальних записів агрегатними функціями
- •2.4. Агрегатні функції і значення null
- •3.1. Групування записів
- •3.2. Секція having – умова відбору груп
- •3.3. Обмеження на умову відбору груп
- •3.4. Значення null і умова відбору груп
- •3.5. Секція having без секції group by
- •Тема 12. З’єднання з базою даних. Використання збережуваних процедур в Delphi
- •1. З’єднання з сервером
- •2. Використання збережуваних процедур в Delphi.
- •Компонент tStoredProc.
- •Тема 13. Використання механізму транзакцій компонента Database. Керування транзакціями
- •Тема 14. Сервер баз даних InterBase і компоненти InterBase Express.
- •1. Сервер баз даних InterBase і компоненти InterBase Express
- •2. Механізм доступу до даних InterBase Express
- •3. Компонент tibDatabase.
- •Тема 15. Виконання запитів за допомогою компонента tibDataSet
- •1. Вибірка даних з таблиці.
- •2. Редагування даних за допомогою візуальних компонентів.
- •3. Програмне редагування даних.
- •Тема 16. Підпорядковані запити в таблицях Механізм master-detail
- •Література
3.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.
Контрольні питання:
Що таке збережувана процедура?
Який синтаксис збережуваних процедур?
Яка команда створює лічильник?
Що виконує індекс? Коли доцільно використовувати індекси?
Що таке виключення? Яка його структура?
Що таке тригер?
Які контекстні змінні використовуються в тригерах?