Перехват запроса в триггере

ded-mazay
Дата: 28.11.2012 18:01:52
Доброго времени!
Допустим есть таблицы:

CREATE TABLE AnyTable (AT_ID number(9) not null primary key);

CREATE TABLE QueryLog (QL_AT_ID number(9) not null references AnyTable,
QL_Date date,
QL_SQLText varchar2 (2000));

Пытаюсь написать триггер на изменение в таблице:
CREATE OR REPLACE TRIGGER ModifyAnyTable
AFTER INSERT OR UPDATE OR DELETE ON AnyTable

FOR EACH ROW

DECLARE
my_sql_text ora_name_list_t;
n number;
my_sql varchar2(2000);

BEGIN

	n := ora_sql_txt(my_sql_text);
	for i in 1..n loop
		my_sql := my_sql || my_sql_text(i);
	end loop;

	if deleting then
		delete from QueryLog
		where QL_AT_ID = :old.AT_ID;
	else
		insert into QueryLog (QL_AT_ID, QL_Date, QL_SQLText)
		values (:new.AT_ID, sysdate, 'test');
	end if;

EXCEPTION
	when DUP_VAL_ON_INDEX then
	update QueryLog
	set QL_Date = sysdate, QL_SQLText = 'test'
	where QL_AT_ID = :new.AT_ID;
END;
/


Триггер создается без ошибок, но при обновлении записи в AnyTable вываливает ошибку:
ORA-06502: PL/SQL: ошибка числа или значения ORA-06512: на "SYS.ModifyAnyTable", line 9 ORA-04088: ошибка во время выполнения триггера 'SYS.ModifyAnyTable.....
"Друзья"
Дата: 28.11.2012 18:24:53
ded-mazay,
О! мой! бог!
на ссылочку на документацию. http://www.oracle.com/technetwork/indexes/documentation/index.html
SY
Дата: 28.11.2012 19:22:58
ded-mazay,

ora_name_list_t заполняется тлько в DDL триггерах. В DML триггерах он даже не инициализирован.

SY.
ded-mazay
Дата: 28.11.2012 20:29:04
SY,

А если не в самом триггире, а в связке с ф-цией как Вы писали вот здесь, что-нибудь может получиться (хотя там Вы предупредили, что работает не во всех версиях.., у меня 9.2.0.8.0 и 11.2.0.1.0..)? Или я что-то в корне недопонимаю (ну не dba я, не пинайте сильно, у меня даже английский оч далеко от большинства кто здесь постит.. :), неужель нельзя сюда обратиться, а не вычитывать прям щас океан литературы..)?
P.S.
Как вы понимаете в триггере из топика вместо текста запроса написано 'test' потомучто проблема не в тексте кот. надо записать (дело не доходит до получения текста запроса смысле)
SY
Дата: 28.11.2012 21:37:18
ded-mazay
А если не в самом триггире, а в связке с ф-цией


Функция get_sql не работает в Oracle 11. Почитай тут.

SY.
stax..
Дата: 30.11.2012 11:05:38
ded-mazay
SY,

А если не в самом триггире, а в связке с ф-цией как Вы писали вот здесь, что-нибудь может получиться (хотя там Вы предупредили, что работает не во всех версиях.., у меня 9.2.0.8.0 и 11.2.0.1.0..)? Или я что-то в корне недопонимаю (ну не dba я, не пинайте сильно, у меня даже английский оч далеко от большинства кто здесь постит.. :), неужель нельзя сюда обратиться, а не вычитывать прям щас океан литературы..)?
P.S.
Как вы понимаете в триггере из топика вместо текста запроса написано 'test' потомучто проблема не в тексте кот. надо записать (дело не доходит до получения текста запроса смысле)

в какой-то девятке был баг и ora_sql_txt работала, зачем исправили фичу, я не знаю

если очень надо то можно попробовать извратится через FGA (я не пробовал, но вроде должно сработать)

CURRENT_SQL returns the first 4K bytes of the current SQL that triggered the fine-grained auditing event. The CURRENT_SQLn attributes return subsequent 4K-byte
CURRENT_SQLn ...


.....
stax