Выполнить триггер при просмотре? - PullRequest
6 голосов
/ 16 января 2009

Я не слишком знаком с триггерами базы данных и / или представлениями. В настоящее время я использую PostgreSQL и HSQL; хотя база данных не так уж важна. Мне просто интересно, если база данных любая предлагает что-то вроде этого:

У меня есть (пример) таблица, подобная этой:

CREATE TABLE DUMMY_TABLE (ID INTEGER, NUMBER INTEGER);

Я создал вид, подобный этому:

CREATE VIEW DUMMY_VIEW AS SELECT * FROM DUMMY_TABLE WHERE NUMBER > 5;

Я вставляю пару сущностей:

INSERT INTO DUMMY_TABLE VALUES(1,2);
INSERT INTO DUMMY_TABLE VALUES(1,10);

так что, конечно, DUMMY_VIEW содержит только VALUES (1,10), когда я звоню

SELECT * FROM DUMMY_VIEW

Итак, теперь я хочу добавить триггер к DUMMY_VIEW, который вызывается всякий раз, когда вставляется сущность с NUMBER> 5.

Я попытался добавить триггеры непосредственно к DUMMY_VIEW в HSQL и PostgreSQL; но они говорят, что триггеры нельзя добавлять к представлениям.

Возможно ли это (или функционально подобное решение)?

Ответы [ 7 ]

12 голосов
/ 18 июля 2011

Следует отметить, что PostgreSQL 9.1+ поддерживает триггеры для представлений. См. В ОЖИДАНИИ 9.1 - ТРИГГЕРЫ НА ВИДАХ для краткого обзора этого.

7 голосов
/ 16 января 2009

Да, триггеры нельзя размещать непосредственно в представлениях. Что вы должны сделать, это поместить триггер в базовую таблицу и проверить, имеет ли новая строка NUMBER значение больше 5.

Примечание. Представление является только сохраненным оператором выбора, поэтому в действительности оно не содержит данных. Вот почему нельзя проверить, вставляются, удаляются или обновляются данные в структуре представления.

2 голосов
/ 17 января 2009

Вы можете использовать правила вместо триггеров ( пример ), но помните, что правила являются специфической функцией PostgreSQL.

2 голосов
/ 16 января 2009

Я думаю, вы должны поставить триггер на столе, а не на представлении.

Триггер может использовать запрос к представлению, чтобы вы DRY .

Есть ли какая-то другая причина, по которой триггер должен быть в представлении, а не в таблице?

Пример в ответ на комментарий

-- Create function
CREATE FUNCTION doWhatIwant() RETURNS trigger AS '
BEGIN
IF NEW.number > 5 THEN
  do_stuff
END IF;
RETURN NEW;
END;
' LANGUAGE plpgsql;

-- Create trigger
CREATE TRIGGER yourTrigger AFTER INSERT ON dummy_table
  FOR EACH ROW EXECUTE PROCEDURE doWhatIwant();
1 голос
/ 17 апреля 2011

HSQLDB 2.x поддерживает как обновляемые представления, так и обновляемые триггером представления.

Ваш пример просмотра сам по себе можно обновить. Поэтому вы можете вставлять / удалять / обновлять строки, используя представление вместо таблицы. Это не позволит использовать строки, содержащие NUMBER <= 5, во вставках и обновлениях. </p>

Вы также можете определить триггеры на представлении. Эти триггеры определяются с помощью INSTEAD OF INSERT, INSTEAD OF UPDATE или INSTEAD OF DELETE. В теле триггера вы можете проверить значения и либо сгенерировать исключение для неверного ввода, либо вставить строку в базовую таблицу.

см. http://hsqldb.org/doc/2.0/guide/triggers-chapt.html

1 голос
/ 16 января 2009

Это возможно, если вы добавляете триггер к таблице с тем же условием, что и представление.

Тело триггера должно иметь что-то вроде:

if (inserted.NUMBER > 5) {
   do something;
}
//do nothing if inserted.NUMBER is not > 5
0 голосов
/ 16 января 2009

Я не уверен, чего вы хотите достичь.

Триггер выполняет код при изменении данных. Представление - это (скажем, «вызываемое подмножество данных»). Он практически не существует, , если вы не выберете его. Он не может содержать триггер, потому что он не содержит ничего.

Таким образом, в основном вам нужен триггер на базовой таблице.

...