Выполнить триггер при просмотре?

Я не слишком знаком с триггерами и / или представлениями базы данных. В настоящее время я использую 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; но говорят, что в представления нельзя добавлять триггеры.

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
10
0
15 372
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

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

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

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

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

-- 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();

Причина, по которой мне нужен триггер в представлении, заключается в том, что он вызывается ТОЛЬКО, когда Number вновь вставленного объекта больше 5. Возможно ли это, если я добавлю триггер в саму таблицу? Мне это все очень незнакомо.

mainstringargs 16.01.2009 19:55

В HSQLDB, когда вы определяете триггер для таблицы, код триггера может иметь условие для вставленных сущностей. Вы должны использовать триггеры AFTER INSERT, AFTER UPDATE и т. д.

fredt 27.05.2011 23:10

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

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

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

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

В теле триггера должно быть что-то вроде:

if (inserted.NUMBER > 5) {
   do something;
}
//do nothing if inserted.NUMBER is not > 5

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

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

в оракуле вы можете размещать триггеры на представлениях

Hoffmann 29.10.2009 00:51

Начиная с postgresql 9.1, вы можете использовать триггеры для представлений.

Joe Van Dyk 24.02.2012 07:50

@JoeVanDyk скопируйте, вставив комментарий марцина: триггеры для представлений используются вместо триггеров и используются только для создания обновляемых представлений. Они не решат проблему из вопроса, так как они не отслеживают изменения в базовых таблицах.

ibizaman 12.01.2018 23:10

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

Как именно правила позволяют запускать триггер, когда представление изменяется из-за изменения базовых данных?

Mitar 20.12.2018 12:37

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

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

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

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

Ответ принят как подходящий

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

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

marcin 22.09.2015 17:35

Другие вопросы по теме