Вызов sproc для каждой затронутой записи изнутри триггера в Sybase ASA 6
Просто некоторые головные боли реализовали что-то в триггере на старой версии Sybase и задавались вопросом, может ли кто-нибудь помочь. В двух словах, я хочу написать триггер, который будет вызывать другое sproc для каждой из затронутых записей (будет ли она вставлена, удалена или обе [обновлена]).
Один из способов сделать это в T-SQL (SQL Server) состоит в том, чтобы использовать курсор, но ни один из примеров курсоров, которые я нашел в Интернете, кажется, на самом деле не работает на Sybase ASA 6.0.4 - он либо не любит T-SQL в общем, или кажется, что компилируется, но обычно ничего не делает (даже с патологически простыми, надуманными сценариями).
По сути, я хочу пройтись по всем "вставленным" записям таблицы (если они есть) и для каждого Exec MySproc (вставлен. Ключ), затем пройти по всем "удаленным" записям таблицы (если есть), и снова для каждого один Exec MySproc (удаленный ключ).
У кого-нибудь есть пример такого рода действий или даже просто использование курсора только для чтения в ASA 6? Кажется, в онлайн-руководстве есть пример простого курсора, но на практике мне не удалось заставить этот пример работать на самом деле. Я мог бы развернуть другое sproc в триггер (это на самом деле не так уж сложно), но это слишком сложно, чтобы сделать это как часть выражения типа "выбрать из вставки..." - это действительно несколько строк кода по-своему, Поэтому я думаю, что мне все равно нужен курсор.
РЕДАКТИРОВАТЬ: (29/12/09) - В итоге я в отчаянии развернул код sproc, но я действительно хотел бы иметь пример работающего курсора в Sybase ASA 6, потому что рано или поздно я столкнусь с чем-то, что смогу " Т легко развернуть. Так что я брошу это за награду - кто-нибудь может дать мне рабочий пример?:-)
1 ответ
Звучит так, как будто вы ищете триггер ROW LEVEL.
По умолчанию триггеры в ASA имеют уровень оператора (триггер выполняется один раз после завершения всего оператора триггера). С другой стороны, триггеры уровня строки выполняются один раз для каждой изменяемой строки.
Вот пример триггера уровня строки:
CREATE TRIGGER tr_log
AFTER UPDATE OF "myfield"
ON mytable
REFERENCING OLD AS old_data NEW AS new_data
FOR EACH ROW
BEGIN
Insert into Narc_USER_INFO_Change (Field_Changed, New_Value, Original_Value, user)
Values('myfield', new_data.myfield, old_data.myfield, CURRENT USER);
END