Как написать правило удаления для представления?

Я пытаюсь написать правило для представления для удаления кортежей из таблиц компонентов, но пока могу удалять только данные от одного из них. Я' Я какое-то время использовал postgres с базовыми представлениями, но у меня нет опыта работы с правилами для представлений.

Я написал дурацкий небольшой тестовый пример, чтобы выяснить / показать мою проблему. В этом примере есть только один родительский кортеж на каждый дочерний кортеж (моя фактическая схема, конечно, не такая).

Таблицы компонентов:

CREATE TABLE parent(
   id serial PRIMARY KEY,
   p_data integer NOT NULL UNIQUE
);
CREATE TABLE child(
   id serial PRIMARY KEY,
   parent_id integer NOT NULL UNIQUE REFERENCES parent(id),
   c_data integer NOT NULL
);

Представление:

CREATE TABLE child_view(
   id integer,
   p_data integer,
   c_data integer
);
CREATE RULE "_RETURN" AS ON SELECT TO child_view DO INSTEAD
   SELECT child.id, p_data, c_data 
      FROM parent JOIN child ON (parent_id=parent.id);

Правило удаления проблемы

CREATE RULE child_delete AS ON DELETE TO child_view DO INSTEAD(
   DELETE FROM child WHERE id=OLD.id;
   DELETE FROM parent WHERE p_data=OLD.p_data;
);

Цель вышеизложенного Правило состоит в том, чтобы удалить кортежи, на которые есть ссылки в представлении, из таблиц компонентов. WHERE p_data = OLD.p_data кажется мне странным, но я не вижу, как еще ссылаться на желаемый кортеж в родительской таблице.

Вот что происходит, когда я пытаюсь использовать указанное выше правило :

>SELECT * FROM child_view;
 id | p_data | c_data 
----+--------+--------
  1 |      1 |     10
  2 |      2 |     11
  3 |      3 |     12
(3 rows)

>DELETE FROM child_view WHERE id=3;
DELETE 0

>SELECT * FROM child_view;
 id | p_data | c_data 
----+--------+--------
  1 |      1 |     10
  2 |      2 |     11
(2 rows)

Но, глядя на родительскую таблицу, вторая часть удаления не работает (id = 3 "должен был быть удален"):

>SELECT * FROM parent;
 id | p_data 
----+--------
  1 |      1
  2 |      2
  3 |      3
(3 rows)

Как мне написать правило удаления для удаления как дочерних, так и родительских кортежей?

Это используется postgres v9.

Любая помощь приветствуется. Также будут оценены указатели на любые материалы, касающиеся правил для представлений за пределами документации postgres (если я явно что-то не пропустил). Спасибо.

РЕДАКТИРОВАТЬ: как указывает jmz, здесь было бы проще использовать каскадное удаление, чем правило, но этот подход не работает для моей реальной схемы.

5
задан academicRobot 4 April 2011 в 14:55
поделиться