Бази даних-20210115T104840Z-001 / Реферат на тему _Современные СУБД_ / Using_MySql,_MS_SQL_Server_and_Oracle
.pdfПример 32: обеспечение консистентности данных |
|
|||||
Oracl |
і Решение 4.1.2.a (триггеры для таблицы subscriptions) |
| |
||||
e |
||||||
|
|
|
|
|
||
1 |
-- Реакция на обновление выдачи книги: |
|
||||
2 |
CREATE OR REPLACE TRIGGER "s has books on sbps upd" |
|||||
3 |
AFTER UPDATE |
|
|
|
||
4 |
ON "subscriptions" |
|
|
|
||
5 |
FOR EACH ROW |
|
|
|
||
6 |
BEGIN |
|
|
|
|
|
7 |
-- A) Читатель тот же, Y -> N |
|
||||
8 |
IF (( old "sb subscriber" = |
new "sb subscriber") AND |
||||
9 |
( old "sb is active" = 'Y') AND |
|
||||
10 |
( new "sb is active" = 'N')) THEN |
|
||||
11 |
UPDATE "subscribers" |
|
|
|||
12 |
SET |
"s books" = "s books" - 1 |
|
|||
13 |
WHERE |
"s id" = |
old "sb subscriber"; |
|||
14 |
END IF; |
|
|
|
|
|
15 |
|
|
|
|
|
|
16 |
-- B) Читатель тот же, N -> Y |
|
||||
17 |
IF (( old "sb subscriber" = |
new "sb subscriber") AND |
||||
18 |
( old "sb is active" = 'N') AND |
|
||||
19 |
( new "sb is active" = 'Y')) THEN |
|
||||
20 |
UPDATE "subscribers" |
|
|
|||
21 |
SET |
"s books" = "s books" + 1 |
|
|||
22 |
WHERE |
"s id" = |
old "sb subscriber"; |
|||
23 |
END IF; |
|
|
|
|
|
24 |
|
|
|
|
|
25-- C) Читатели разные, Y -> Y
26IF (( old "sb subscriber" != new "sb subscriber") AND
27( old "sb is active" = 'Y') AND
28( new "sb is active" = 'Y')) THEN
29UPDATE "subscribers"
30 |
SET |
"s books" = "s books" - 1 |
|
31 |
WHERE |
"s id" = |
old "sb subscriber"; |
32 |
UPDATE "subscribers" |
||
33 |
SET |
"s books" = "s books" + 1 |
|
34 |
WHERE |
"s id" = |
new "sb subscriber"; |
35 |
END IF; |
|
|
36 |
|
|
|
37-- D) Читатели разные, Y -> N
38IF (( old "sb subscriber" != new "sb subscriber") AND
39( old "sb is active" = 'Y') AND
40( new "sb is active" = 'N')) THEN
41UPDATE "subscribers"
42 |
SET |
"s books" = "s books" - 1 |
43 |
WHERE |
"s id" = old "sb subscriber"; |
44 |
END IF; |
|
45 |
|
|
46-- E) Читатели разные, N -> Y
47IF (( old "sb subscriber" != new "sb subscriber") AND
48( old "sb is active" = 'N') AND
49( new "sb is active" = 'Y')) THEN
50UPDATE "subscribers"
51 |
SET |
"s books" = "s books" + 1 |
52 |
WHERE |
"s id" = new "sb subscriber"; |
53END IF;
54END;
Витоге код триггеров для Oracle получился полностью идентичным коду триггеров для MySQL, потому и запросы для проверки работоспособности полученного решения также совпадают для обеих СУБД.
См. код самих запросов ниже, а логика их работы с пояснением и демонстрацией изменения содержимого таблицы subscribers представлена в решении для
MySQL.
Работа с MySQL, MS SQL Server и Oracle в примерах © EPAM Systems, RD Dep, 2016-2018 Стр: 320/545
Пример 32: обеспечение консистентности данных
|
Oracl |
і |
Решение 4.1.2.a (проверка работоспособности) |
| |
e |
|
|||
|
|
|
|
|
1 |
|
ALTER TRIGGER "TRG_subscriptions_sb_id" DISABLE; |
||
2 |
|
|
|
|
3-- Добавим Иванову И.И. активную выдачу, а Петрову П.П. неактивную:
4INSERT INTO "subscriptions"
5 |
VALUES |
(200 |
6 |
|
1, |
7 |
|
1, |
8 |
|
TO DATE('2011-01-12', 'YYYY-MM-DD'), |
9 |
|
TO DATE('2011-02-12', 'YYYY-MM-DD'), |
10 |
|
'Y'); |
11 |
INSERT INTO "subscriptions" |
|
12 |
VALUES |
(201 |
13 |
|
2, |
14 |
|
1, |
15 |
|
TO DATE('2011-01-12', 'YYYY-MM-DD'), |
16 |
|
TO DATE('2011-02-12', 'YYYY-MM-DD'), |
17 |
|
'N'); |
18 |
|
|
19-- Удалим добавленные выдачи:
20DELETE FROM "subscriptions"
21 |
WHERE "sb_id" IN ( 200 201 ); |
22 |
|
23-- Проверим реакцию на обновление выдач книг. Сначала добавим выдачу:
24INSERT INTO "subscriptions"
25 |
VALUES |
(300 |
26 |
|
1, |
27 |
|
1, |
28 |
|
TO DATE('2011-01-12', 'YYYY-MM-DD'), |
29 |
|
TO DATE('2011-02-12', 'YYYY-MM-DD'), |
30 |
|
'Y'); |
31 |
|
|
32-- A) Не меняя идентификатор читателя сделаем выдачу неактивной:
33UPDATE "subscriptions"
34 |
SET |
"sb is active" = 'N' |
35 |
WHERE |
"sb_id" = 300 |
36 |
|
|
37-- B) Не меняя идентификатор читателя сделаем выдачу снова активной:
38UPDATE "subscriptions"
39 |
SET |
"sb is active" = 'Y' |
40 |
WHERE |
"sb_id" = 300 |
41 |
|
|
42-- C) Изменим идентификатор читателя, не меняя состояние активности выдачи:
43UPDATE "subscriptions"
44 |
SET |
"sb subscriber" = 2 |
45 |
WHERE |
"sb_id" = 300 |
46 |
|
|
47-- D) Изменим идентификатор читателя и сделаем выдачу неактивной:
48UPDATE "subscriptions"
49 |
SET |
"sb subscriber" = 1 |
50"sb is active" = 'N'
51WHERE "sb_id" = 300
52
53-- E) Изменим идентификатор читателя и сделаем выдачу активной:
54UPDATE "subscriptions"
55 |
SET |
"sb subscriber" = 2, |
56"sb is active" = 'Y'
57WHERE "sb_id" = 300
58
59-- Удалим книгу с id = 1 (выдана по одной штуке Петрову и обоим Сидоровым):
60DELETE FROM [books]
61WHERE [b_id] = 1
62
63 ALTER TRIGGER "TRG subscriptions sb id" ENABLE;
Итак, решение данной задачи получено и проверено для всех трёх СУБД.
Работа с MySQL, MS SQL Server и Oracle в примерах © EPAM Systems, RD Dep, 2016-2018 Стр: 321/545
Пример 32: обеспечение консистентности данных
MySQL I |
Решение 4.1.2.b (триггеры для таблицы m2m books genres) (продолжение) |
| |
29-- Реакция на удаление связи между книгами и жанрами:
30CREATE TRIGGER 'g_has_books_on_m2m_b_g_del'
31AFTER DELETE
32ON 'm2m_books_genres'
33FOR EACH ROW
34BEGIN
35UPDATE 'genres'
36 |
SET |
'g books' = 'g books' - 1 |
37WHERE 'g id' = OLD.'g id';
38END;
39$$
40
41 DELIMITER ;
Поскольку в MySQL триггеры не активируются каскадными операциями, удаление книги (которое приведёт к удалению всех её связей со всеми жанрами) останется незаметным для триггеров на таблице m2m_books_genres. Потому мы должны создать триггер на таблице books, учитывающий соответствующую ситуацию.
Каждая книга связана с каждым жанром не более одного раза, потому при удалении любой книги нужно на единицу уменьшить счётчик книг у каждого из жанров, с которыми она связана.
MySQL Решение 4.1.2.b (триггер для таблицы books)
1 DELIMITER $$
2
3-- Реакция на удаление книги:
4CREATE TRIGGER 'g has books on books del'
5BEFORE DELETE
6ON 'books'
7FOR EACH ROW
8BEGIN
9UPDATE 'genres'
10 |
SET |
'g books' = 'g books' - 1 |
|
11 |
WHERE |
'g id' IN (SELECT 'g id' |
|
12 |
|
FROM |
'm2m books genres' |
13 |
|
WHERE |
'b id' = OLD.'b id'); |
14END;
15$$
16
17 DELIMITER ;
Проверим корректность полученного решения. Будем модифицировать данные в таблицах m2m_books_genres и books и проверять изменения в таблице genres.
Исходное состояние таблицы genres:
g_id |
g_name |
g books |
1 |
Поэзия |
2 |
2 |
Программирование |
3 |
3 |
Психология |
1 |
4 |
Наука |
0 |
5 |
Классика |
4 |
6 |
Фантастика |
1 |
Работа с MySQL, MS SQL Server и Oracle в примерах © EPAM Systems, RD Dep, 2016-2018 Стр: 323/545
Пример 32: обеспечение консистентности данных
Добавим две связи к жанру «Наука» (идентификатор жанра равен 4):
MySQL I Решение 4.1.2.b (проверка работоспособности)
|
1 |
INSERT INTO 'm2m books genres' |
|||
|
2 |
|
('b id', |
|
|
|
3 |
|
'g id') |
|
|
|
4 |
VALUES |
(1, 4), |
|
|
|
5 |
|
(2, 4) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
g_id |
g_name |
g_books |
|
|
|
1 |
Поэзия |
|
2 |
|
|
2 |
Программирование |
3 |
|
|
|
3 |
Психология |
|
1 |
|
|
4 |
Наука |
|
2 |
|
|
5 |
Классика |
|
4 |
|
|
6 |
Фантастика |
|
1 |
|
Изменим в этих связях значения идентификаторов книг, не меняя значения идентификаторов жанров:
|
MySQL I |
Решение 4.1.2.b (проверка работоспособности) | |
|
1 |
UPDATE 'm2m books |
genres' |
|
2 |
SET |
'b id' = 3 |
|
3WHERE 'b id' = 1
4AND 'g id' = 4;
6 |
UPDATE 'm2m books genres' |
|||
7 |
SET |
'b id' = 4 |
|
|
8 |
WHERE |
'b id' = 2 |
|
|
9 |
AND 'g id' = 4; |
|
|
|
|
|
|
|
|
|
|
|
|
|
g_id |
|
g_name |
g_books |
|
1 |
Поэзия |
2 |
|
|
2 |
Программирование |
3 |
|
|
3 |
Психология |
1 |
|
|
4 |
Наука |
|
2 |
|
5 |
Классика |
4 |
|
|
6 |
Фантастика |
1 |
|
Изменим в этих связях значения идентификаторов жанров, не меняя значения идентификаторов книг:
MySQL і Решение 4.1.2.b (проверка работоспособности)
|
1 |
UPDATE |
'm2m books genres' |
|||
|
2 |
SET |
'g id' = |
5 |
|
|
|
3 |
WHERE |
'b id' = |
3 |
|
|
|
4 |
AND 'g id' = |
4; |
|
|
|
|
5 |
|
|
|
|
|
|
6 |
UPDATE 'm2m books genres' |
||||
|
7 |
SET |
'g id' = |
5 |
|
|
|
8 |
WHERE |
'b id' = |
4 |
|
|
|
9 |
AND 'g id' = |
4; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
g id |
|
g_name |
|
g books |
|
|
1 |
Поэзия |
|
2 |
|
|
|
2 |
Программирование |
3 |
|
||
|
3 |
Психология |
|
1 |
|
|
|
4 |
Наука |
|
|
0 |
|
|
5 |
Классика |
|
6 |
|
|
|
6 |
Фантастика |
|
1 |
|
Работа с MySQL, MS SQL Server и Oracle в примерах © EPAM Systems, RD Dep, 2016-2018 Стр: 324/545
Пример 32: обеспечение консистентности данных
Изменим в этих связях значения идентификаторов жанров, и идентификаторов книг одновременно:
|
MySQL I |
Решение 4.1.2.b (проверка работоспособности) | |
|
1 |
UPDATE 'm2m books genres' |
||
2 |
SET |
|
'b id' = 1, |
3 |
|
|
'g id' = 4 |
4 |
WHERE |
'b id' = 3 |
|
5 |
AND 'g id' = 5; |
||
6 |
|
|
|
7 |
UPDATE 'm2m books genres' |
||
8 |
SET |
|
'b id' = 2, |
9'g id' = 4
10WHERE 'b id' = 4
11AND 'g_id' = 5;
g id |
|
g_name |
g books |
|
|
1 |
|
Поэзия |
2 |
|
|
2 |
|
Программирование |
3 |
|
|
3 |
|
Психология |
1 |
|
|
4 |
|
Наука |
2 |
|
|
5 |
|
Классика |
4 |
|
|
6 |
|
Фантастика |
1 |
|
|
|
|
Удалим эти созданные для проверки работоспособности решения связи: |
|||
|
|
Решение 4.1.2.b |
|
|
|
1 |
DELETE FROM ' m2m_books genres' |
||||
2 |
WHERE 'b_id' = 1 |
|
|
|
|
3 |
|
AND 'g_id' = 4; |
|
|
|
4 |
|
|
|
|
|
5 |
DELETE FROM ' m2m_books genres' |
||||
6 |
WHERE 'b_id' = 2 |
|
|
|
|
7 |
|
AND 'g_id' = 4; |
|
|
|
|
|
|
|
|
|
|
|
|
|
||
g id |
|
g_name |
g books |
|
|
1 |
|
Поэзия |
2 |
|
|
2 |
|
Программирование |
3 |
|
|
3 |
|
Психология |
1 |
|
|
4 |
|
Наука |
0 |
|
|
5 |
|
Классика |
4 |
|
|
6 |
|
Фантастика |
1 |
|
|
Удалим книги с идентификаторами 1 и 2 (обе эти книги одновременно относятся к жанрам «Поэзия» и «Классика»):
MySQL Решение 4.1.2.b (проверка работоспособности)
|
|
1 DELETE FROM 'books' |
|
2 |
WHERE 'b id' IN 1 2 |
|
|
|
|
|
|
g_id |
|
g_name |
g_books |
1 |
|
Поэзия |
0 |
2 |
|
Программирование |
3 |
3 |
|
Психология |
1 |
4 |
|
Наука |
0 |
5 |
|
Классика |
2 |
6 |
|
Фантастика |
1 |
Итак, решение для MySQL завершено и проверено.
Работа с MySQL, MS SQL Server и Oracle в примерах © EPAM Systems, RD Dep, 2016-2018 Стр: 325/545
Пример 32: обеспечение консистентности данных
Переходим к решению для MS SQL Server. Модифицируем таблицу и проинициализируем данные.
MS SQL Решение 4.1.2.b (модификация таблицы и инициализация данных)
1-- Модификация таблицы:
2ALTER TABLE [genres]
3ADD [g_books] INT NOT NULL DEFAULT 0;
5-- Инициализация данных:
6UPDATE [genres]
7 |
SET |
[g_books] = [g_has_books] |
8 |
FROM |
[genres] |
9 |
|
JOIN (SELECT [g_id], |
10 |
|
COUNT [b_id]) AS [g_has_books] |
11 |
FROM |
[m2m_books_genres] |
12 |
GROUP |
BY [g_id]) AS [prepared_data] |
13ON [genres].[g id] = [prepared data].[g
ВMS SQL Server триггеры активируются каскадными операциями, потому здесь будет достаточно создать триггеры только на таблице m2m_books_genres.
INSERT- и DELETE-триггеры достаточно просты: каждый из них подсчитывает
количество книг, добавленных к жанру или убранных у жанра, и изменяет счётчик книг у соответствующего жанра на полученное значение.
MS S |
QL I |
Решение 4.1.2.b (триггеры для таблицы m2m books genres) |
| |
1-- Реакция на добавление связи между книгами и жанрами:
2CREATE TRIGGER [g has books on m2m b g ins]
3ON [m2m_books_genres]
4AFTER INSERT
5AS
6UPDATE [genres ]
7 |
SET |
[g books] = [g books] + [g new books] |
8 |
FROM |
[genres] |
9 |
|
JOIN (SELECT [g id] |
10 |
|
COUNT [b id]) AS [g new books] |
11 |
FROM |
[inserted] |
12 |
GROUP |
BY [g id] ) AS [prepared data] |
13ON [genres] [g id] = [prepared data] [g id];
14GO
15
16-- Реакция на обновление связи между книгами и жанрами:
17CREATE TRIGGER [g_has_books_on_m2m_b_g_upd]
18ON [m2m books genres]
19AFTER UPDATE
20AS
21UPDATE [genres ]
22 |
SET |
[g books] = [g books] + [delta] |
||
23 |
FROM |
[genres] |
|
|
24 |
|
JOIN (SELECT [g id] |
|
|
25 |
|
|
SUM([delta]) AS [delta] |
|
26 |
|
FROM |
(SELECT [g id] |
|
27 |
|
|
|
-COUNT([b id] AS [delta] |
28 |
|
|
FROM |
[deleted] |
29 |
|
|
GROUP |
BY [g id] |
30 |
|
|
UNION |
|
31 |
|
|
SELECT [g id] |
|
32 |
|
|
|
COUNT([b id]) AS [delta] |
33 |
|
|
FROM |
[inserted] |
34 |
|
|
GROUP |
BY [g id] AS [raw deltas] |
35 |
|
GROUP |
BY [g id] i AS [ready delta] |
36ON [genres] [g id] = [ready delta] [g id];
37GO
Работа с MySQL, MS SQL Server и Oracle в примерах © EPAM Systems, RD Dep, 2016-2018 Стр: 326/545
Пример 32: обеспечение консистентности данных
MS SQL |
|
Решение 4.1.2.b (триггеры для таблицы m2m books genres) (продолжение) |
| |
38 |
-- Реакция на удаление связи между книгами и жанрами: |
|
|
39 |
CREATE TRIGGER [g has books on m2m b g del] |
|
40ON [m2m books genres]
41AFTER DELETE
42AS
43UPDATE [genres]
44 |
SET |
[g books] = [g books] - [g old books] |
45FROM [genres]
46JOIN (SELECT [g id],
47 |
|
COUNTl[b id]) AS [g old books] |
|
48 |
FROM |
[deleted] |
|
49 |
GROUP |
BY [g id] |
AS [prepared data] |
50ON [genres] [g id] = [prepared data] [g id];
51GO
Логика UPDATE-триггера чуть более сложная. Чтобы не выполнять два отдельных обновления таблицы genres, мы сначала в строках 26-34 запроса получаем «сводную таблицу» по удалённым и добавленным связям между книгами и жанрами. Эта таблица в некоторой гипотетической ситуации может выглядеть так:
g_id |
delta |
3 |
4 |
5 |
1 |
1 |
-3 |
3 |
-6 |
6 |
2 |
Со знаком минус представлено количество удалённых связей между книгами и жанрами, со знаком полюс — количество добавленных связей. Обратите внимание на жанр с идентификатором 3, у которого за одну операцию обновления часть связей было удалено, часть добавлено. В строке 25 запроса эти отрицательные и положительные значения суммируются, формируя таким образом итоговую дельту количества связей между жанрами и книгами.
g_id |
delta |
3 |
-2 |
5 |
1 |
1 |
-3 |
6 |
2 |
В строке 22 запроса эти данные используются для изменения значения счётчика связей между жанрами и книгами.
Проверить работоспособность полученного решения можно с помощью следующих запросов (которые подробно рассмотрены в решении для MySQL).
MS SQL Решение 4.1.2.b (проверка работоспособности) і
1-- Добавление двух связей к жанру «Наука» (идентификатор жанра равен 4):
2INSERT INTO [m2m_books_genres]
3 |
|
([b_id], |
|
4 |
|
[g_id]) |
|
|
(1, 4), |
||
5 |
VALUES |
||
(2, 4); |
|||
6 |
|
||
|
|
Работа с MySQL, MS SQL Server и Oracle в примерах © EPAM Systems, RD Dep, 2016-2018 Стр: 327/545
Пример 32: обеспечение консистентности данных
MS SQL Решение 4.1.2.b (проверка работоспособности) (продолжение)
7-- Изменение в добавленных связях значения идентификаторов книг,
8-- без изменения значения идентификаторов жанров:
9UPDATE [m2m_books_genres]
10 SET |
[b_id] = 3 |
11WHERE [b_id] = 1
12AND [g_id] = 4;
14UPDATE [m2m_books_genres]
15 SET |
[b_id] = 4 |
16WHERE [b_id] = 2
17AND [g_id] = 4;
19-- Изменение в добавленных связях значения идентификаторов жанров,
20-- без изменения значения идентификаторов книг:
21UPDATE [m2m_books_genres]
22 SET |
[g_id] = 5 |
23WHERE [b_id] = 3
24AND [g_id] = 4;
26UPDATE [m2m_books_genres]
27 SET |
[g_id] = 5 |
28WHERE [b_id] = 4
29AND [g_id] = 4;
31-- Изменение в добавленных связях значения идентификаторов жанров,
32-- и идентификаторов книг одновременно:
33UPDATE [m2m_books_genres]
34 SET |
[b_id] = 1, |
35[g_id] = 4
36WHERE [b_id] = 3
37AND [g_id] = 5;
39UPDATE [m2m_books_genres]
40 SET |
[b_id] = 2, |
41[g_id] = 4
42WHERE [b_id] = 4
43AND [g_id] = 5;
45-- Удаление ранее созданных связей:
46DELETE FROM [m2m_books_genres]
47 |
WHERE [b_id] = |
1 |
48 |
AND [g_id] = |
4; |
49 |
|
|
50 |
DELETE FROM [m2m_books_genres] |
51WHERE [b_id] = 2
52AND [g_id] = 4;
54-- Удаление книг с идентификаторами 1 и 2 (обе эти книги одновременно
55-- относятся к жанрам «Поэзия» и «Классика»):
56DELETE FROM [books]
57WHERE [bid] IN (1, 2);
Итак, решение для MySQL завершено и проверено.
Переходим к решению для Oracle. Т.к. данная СУБД не поддерживает псевдотаблицы inserted и deleted, мы будем опираться на логику решения для MySQL. Все соответствующие подробности этого решения уже описаны выше, потому здесь будет представлен только SQL-код.
Также отметим, что поскольку в Oracle триггеры активируются каскадными операциями, в данном решении (в отличие от решения для MySQL) не потребуется создавать DELETE-триггер на таблице books.
Работа с MySQL, MS SQL Server и Oracle в примерах © EPAM Systems, RD Dep, 2016-2018 Стр: 328/545
Пример 32: обеспечение консистентности данных |
|
|||||
Oracl |
і |
Решение 4.1.2.b (модификация таблицы и инициализация данных) |
| |
|||
e |
||||||
|
|
|
|
|
||
1 |
-- Модификация таблицы: |
|
|
|||
2 |
ALTER TABLE "genres" |
|
|
|||
3 |
ADD |
"g_books" NUMBER(10 |
DEFAULT 0 NOT NULL); |
|
||
4 |
|
|
|
|
|
|
5 |
-- Инициализация данных: |
|
|
|||
6 |
UPDATE "genres" "outer" |
|
|
|||
7 |
SET |
"g books" = |
|
|
||
8 |
|
NVL((SELECT COUNT "b id") AS "g has books" |
|
|||
9 |
|
FROM |
"m2m books genres" |
|
||
10 |
|
WHERE "outer" "g id" = "g id" |
|
|||
11 |
|
GROUP |
BY "g__id"),0); |
|
Oracle I Решение 4.1.2.b (триггеры для таблицы m2m_books_genres)
1-- Реакция на добавление связи между книгами и жанрами:
2CREATE TRIGGER "g_has_bks_on_m2m_b_g_ins" AFTER INSERT
3ON "m2m_books_genres"
4FOR EACH ROW
5BEGIN
6UPDATE "genres"
7 |
SET |
"g_books" = "g_books" + 1 |
8 |
WHERE |
"g_id" = new "g_id" |
9 |
END; |
|
10 |
|
|
11 |
-- Реакция на обновление связи между книгами и жанрами: |
|
12 |
|
|
13CREATE TRIGGER "g_has_bks_on_m2m_b_g_upd"
14AFTER UPDATE
15ON "m2m_books_genres"
16FOR EACH ROW
17BEGIN
18UPDATE "genres"
19 |
SET |
"g_books" = "g_books" + 1 |
20WHERE "g_id" = new "g_id"
21UPDATE "genres"
22 |
SET |
"g_books" = "g_books" - 1 |
23WHERE "g_id" = :old "g_id"
24END;
25
26-- Реакция на удаление связи между книгами и жанрами:
27CREATE TRIGGER "g_has_bks_on_m2m_b_g_del" AFTER DELETE
28ON "m2m_books_genres"
29FOR EACH ROW
30BEGIN
31UPDATE "genres"
32 |
SET |
"g_books" = "g_books" - 1 |
33WHERE "g_id" = :old "g_id"
34END;
35
Проверить работоспособность полученного решения можно с помощью следующих запросов (которые подробно рассмотрены в решении для MySQL).
Oracle |
Решение 4.1.2.b (проверка работоспособности) |
||
|
|
|
|
1 |
-- Добавление двух связей к жанру «Наука» (идентификатор жанра равен 4): |
||
2 |
INSERT INTO "m2m_books_genres" |
||
3 |
|
("b id", "g id") |
|
4 |
VALUES |
(1, 4); |
|
5 |
|
|
|
6 |
INSERT INTO "m2m_books_genres" |
||
7 |
|
("b id", "g id") |
|
8 |
VALUES |
(2, 4); |
|
|
|
|
|
Работа с MySQL, MS SQL Server и Oracle в примерах © EPAM Systems, RD Dep, 2016-2018 Стр: 329/545