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





Я думаю, вы должны положить на стол триггер, а не представление.
Триггер может использовать запрос к представлению, чтобы вы были СУХОЙ.
Есть ли другая причина, по которой триггер должен находиться в представлении, а не в таблице?
Пример в ответ на комментарий
-- 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();
В HSQLDB, когда вы определяете триггер для таблицы, код триггера может иметь условие для вставленных сущностей. Вы должны использовать триггеры AFTER INSERT, AFTER UPDATE и т. д.
Я не уверен, чего вы хотите достичь.
Триггер выполняет код при изменении данных. Представление - это (скажем,) «вызываемый подмножество данных». Его практически не существует, пока не вы выбираете из него. Он не может содержать триггер, потому что в нем содержит ничего нет.
Итак, в основном вам нужен триггер для базовой таблицы.
Это возможно, если вы добавите триггер в таблицу с тем же условием, что и представление.
В теле триггера должно быть что-то вроде:
if (inserted.NUMBER > 5) {
do something;
}
//do nothing if inserted.NUMBER is not > 5
Да, триггеры нельзя размещать непосредственно на представлениях. Что вам нужно сделать, так это поместить триггер в базовую таблицу и проверить, имеет ли новая строка NUMBER значение больше 5.
Примечание: представление - это только сохраненный оператор выбора, поэтому на самом деле оно не содержит данных. Вот почему нельзя проверить, вставляются ли, удаляются или обновляются данные в структуре представления.
в оракуле вы можете размещать триггеры на представлениях
Начиная с postgresql 9.1, вы можете использовать триггеры для представлений.
@JoeVanDyk скопируйте, вставив комментарий марцина: триггеры для представлений используются вместо триггеров и используются только для создания обновляемых представлений. Они не решат проблему из вопроса, так как они не отслеживают изменения в базовых таблицах.
Вы можете использовать правила вместо триггеров (пример), но помните, что правила специфичны для PostgreSQL.
Как именно правила позволяют запускать триггер, когда представление изменяется из-за изменения базовых данных?
HSQLDB 2.x поддерживает как обновляемые представления, так и представления, обновляемые триггером.
Ваш пример представления обновляется сам по себе. Поэтому вы можете вставлять / удалять / обновлять строки, используя представление вместо таблицы. Это не позволит строкам, содержащим NUMBER <= 5, вставлять и обновлять.
Вы также можете определить триггеры в представлении. Эти триггеры определяются с помощью INSTEAD OF INSERT, INSTEAD OF UPDATE или INSTEAD OF DELETE. В теле триггера вы можете проверить значения и либо выдать исключение для недопустимого ввода, либо вставить строку в базовую таблицу.
Следует отметить, что PostgreSQL 9.1+ поддерживает триггеры для представлений. См. ОЖИДАНИЕ 9.1 - ТРИГГЕРЫ НА ПРОСМОТРАХ для краткого обзора этого.
триггеры для представлений вместо триггеров используются только для создания обновляемых представлений. Они не решат проблему из вопроса, так как они не отслеживают изменения в базовых таблицах.
Причина, по которой мне нужен триггер в представлении, заключается в том, что он вызывается ТОЛЬКО, когда Number вновь вставленного объекта больше 5. Возможно ли это, если я добавлю триггер в саму таблицу? Мне это все очень незнакомо.