TO структура_пам’яті
ON (ключ1, ключ2,. ..) і
INDEX ON ім’я_відношення IS ім’я_індекса (ключ1, ключ2,. ..)
Оператор MODIFY змінює структуру відношення, що зберігається відповідно до параметра структура_пам’яті і заданого набору ключових атрибутів. Оператор INDEX створює окрему індексну структуру для заданих полів даного відношення. Створені індекси використовуються системою для оптимізації виконання операторів маніпулювання даними. Узгодженість вмісту відносин і індексів підтримується системою автоматично.
Мова QUEL містить також оператори визначення обмежень цілісності, представлень і обмежень доступу. На них ми зупинимося трохи пізніше.
У тому вигляді, в якому ми його стисло описали, мова QUEL призначена для інтерактивної роботи з базами даних Ingres. Для програмування прикладних інформаційних систем, які повинні взаємодіяти з базами даних, була розроблена мова програмування EQUEL, що є, по суті, розширенням мови програмування Сі шляхом вбудовування в нього операторів мови QUEL. Мова EQUEL визначається таким чином:
Будь-який оператор мови Сі є оператором мови EQUEL.
Будь-який оператор мови QUEL, якому передують два знаки '#', є допустимим оператором мови EQUEL.
Змінні Сі-програми можуть використовуватися в операторах QUEL, замінюючи імена відносин, імена атрибутів, елементи списку вибірки або константи. Ті змінні Сі-програми, які використовуються таким чином, повинні при своєму оголошенні бути помічені подвійним знаком '#'.
Оператор RETRIEVE (без INTO) супроводиться складовим оператором мови Сі, який виконується по одному разу для кожного вибраного кортежу.
Приклад програми на мові EQUEL, що видає номер групи на ім'я студента:
main()
{
## char stud_name[20];
## int group_number;
while (READ(stud_name_)
{
## RANGE OF S IS STUDENTS
## RETRIEVE (group_number = G.GROUP.NUMBER)
## WHERE (S.STUD_NAME = stud_name)
{
PRINT ("The group number of 'stud_name' is 'group_number');
}
}
}
Програма на мові EQUEL обробляється спеціальним препроцесором, який перетворює її в звичайну Сі-програму, що містить виклики Ingres з передачею як параметри текстів операторів мови QUEL. Подальшу схему ми вже обговорювали.
8.5. Загальний підхід до організації уявлень, обмежень цілісності і контролю доступу
Ми об'єднали ці три уявні не дуже близькими теми, тому що в Ingres для розв'язання відповідних проблем застосовується єдиний підхід, заснований на модифікації операторів SQL. Почнемо з уявлень. Як і в System R (точніше, в мові SQL), представлення бази даних - це деякий іменований запит з іменованими полями результуючого відношення.
Наприклад, оператор
DEFINE VIEW GROUP310
(STUD_NUMBER = S.STUD_NUMBER,
STUD_NAME = S.STUD_NAME,
STUD_STATUS = S.STUD_STATUS)
WHERE (S.GROUP_NUMBER = 310)
визначає відношення, що представляється, що включає номери студентських квитків і імена студентів з групи 310.
Передбачимо, що ми хочемо тепер знайти неуспішних студентів у відношенні GROUP310:
RANGE OF G310 IS GROUP310
RETRIEVE (G310.STUD_NAME)
WHERE (G310.STUD_STATUS = "NO")
Тоді після модифікації цей запит буде виглядати таким чином:
RETRIEVE (STUD_NUMBER = S.STUD_NUMBER, STUD_NAME =
S.STUD_NAME, STUD_STATUS = S.STUD_STATUS)
WHERE (S.GROUP_NUMBER = 310 AND
S.STUD_STATUS = "NO")
На тих же самих принципах побудований контроль доступу до даних і контроль цілісності баз даних. Наприклад, обмеження доступу до відношення СТУДЕНТИ може бути визначено таким чином:
DEFINE PERMIT RETRIEVE, REPLACE
ON S
TO PETROV
AT TTA5
FROM 9:00 TO 15:00
ON MON TO FRI
WHERE (S.GROUP_NUMBER = 310)
Це означає, що Петрову дозволяється читати і модифікувати відношення СТУДЕНТИ з термінала TTA5 у час від 9 до 15:00 в робочі дні тижня, причому тільки ті кортежі, які задовольняють сформульованій умові. При компіляції будь-якого оператора QUEL над відношенням СТУДЕНТИ цей оператор буде модифікуватися таким чином, щоб він був виконаний при виконанні умов хоч би одного з обмежень доступу.
Аналогічно, якщо для відношення СТУДЕНТИ визначено обмеження цілісності
DEFINE INTEGRITY
ON S
WHERE (S.STUD_STIP < 150,000)
то до умови будь-якого оператора зміни кортежів відношення СТУДЕНТИ буде через AND додаватися умови всіх обмежень цілісності, визначених для цього відношення.
На закінчення цієї лекції помітимо, що звичайно, в Ingres підтримується механізм паралельних транзакцій з відповідною синхронізацій доступу і журналізація змін баз даних. Однак нам не відомі які-небудь особливості механізмів, що застосовуються. На особливостях оптимізації операторів QUEL ми зупинимося в лекції, присвяченій оптимізаціям в мовах баз даних.