Триггеры операторов при просмотре в Oracle - PullRequest
3 голосов
/ 10 февраля 2011

Возможно ли в БД Oracle создать триггер Statement (но не триггер Row) для VIEW?

Когда я создаю триггер INSTEAD OF без FOR EACH ROW в представлении, Oracle запускаеттриггер для каждой строки любым способом.

Например, следующий код:

CREATE TABLE TEST_TABLE (
   MY_DATA VARCHAR(30)
);

INSERT INTO TEST_TABLE(MY_DATA) VALUES('one');
INSERT INTO TEST_TABLE(MY_DATA) VALUES('two');
INSERT INTO TEST_TABLE(MY_DATA) VALUES('three');

CREATE OR REPLACE VIEW TEST_VIEW AS
   SELECT * FROM TEST_TABLE;

CREATE OR REPLACE TRIGGER TEST_VIEW_TRG1
   INSTEAD OF DELETE ON TEST_VIEW
DECLARE
BEGIN
   Dbms_Output.Put_Line('STATEMENT TRIGGER.');
END;
/

CREATE OR REPLACE TRIGGER TEST_VIEW_TRG2
   INSTEAD OF DELETE ON TEST_VIEW FOR EACH ROW
DECLARE
BEGIN
   Dbms_Output.Put_Line('ROW TRIGGER: '||:OLD.MY_DATA);
END;
/

DELETE FROM TEST_VIEW;

Создает следующий вывод:

ROW TRIGGER: one
STATEMENT TRIGGER.
ROW TRIGGER: two
STATEMENT TRIGGER.
ROW TRIGGER: three
STATEMENT TRIGGER.

Когда я создаю триггеры TEST_VIEW_TRG1и TEST_VIEW_TRG2 как AFTER на TEST_TABLE (вместо TEST_VIEW) выходной сигнал соответствует ожидаемому:

ROW TRIGGER: one
ROW TRIGGER: two
ROW TRIGGER: three
STATEMENT TRIGGER.

Есть ли обходное решение для этой проблемы?

1 Ответ

9 голосов
/ 10 февраля 2011

INSTEAD OF Триггеры в представлениях всегда основаны на строках, как указано в Документах: http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_7004.htm#i2235611

ДЛЯ КАЖДОГО РЯДА Укажите FOR EACH ROW, чтобы обозначить триггер как триггер строки. Oracle Database запускает триггер строки один раз для каждой строки, на которую влияет оператор триггера, и удовлетворяет необязательному ограничению триггера, определенному в условии WHEN.

За исключением триггеров INSTEAD OF, если вы пропустите это предложение, то триггер будет триггером оператора. Oracle Database запускает триггер оператора только один раз, когда запускается оператор триггера, если выполняется необязательное ограничение триггера.

Операторы триггера INSTEAD OF неявно активируются для каждой строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...