Вызов sproc для каждой затронутой записи изнутри триггера в Sybase ASA 6 - PullRequest
0 голосов
/ 21 декабря 2009

просто некоторые головные боли при реализации чего-то в триггере на старой версии Sybase и задались вопросом, может ли кто-нибудь помочь. Вкратце, я хочу написать триггер, который будет вызывать другое sproc для каждой из затронутых записей (будь то вставка, удаление или и то и другое [обновлено]).

Одним из способов сделать это в T-SQL (SQL Server) было бы использование курсора, но ни один из примеров курсоров, которые я нашел в Интернете, кажется, на самом деле не работает на Sybase ASA 6.0.4 - он либо не любит T-SQL в целом или он, кажется, компилируется, но обычно ничего не делает (даже с патологически простыми, надуманными сценариями).

По сути, я хочу пройтись по всем «вставленным» записям таблицы (если есть) и для каждой Exec MySproc (insert.keyid) , а затем перебрать все «удаленные» записи таблицы (если есть), и снова для каждого Exec MySproc (dele.keyid) .

У кого-нибудь есть пример такого рода действий или даже просто использование курсора только для чтения в ASA 6? Кажется, в онлайн-руководстве есть пример простого курсора, но на практике мне не удалось заставить этот пример работать. Я мог бы развернуть другое sproc в триггер (на самом деле это не так уж сложно), но это слишком сложно сделать как часть оператора типа «выбрать из вставленного ...» - это действительно несколько строк кода в своем собственном праве. Поэтому я все равно думаю, что мне нужен курсор.

РЕДАКТИРОВАТЬ : (29/12/09) - я в отчаянии развернул код sproc, но мне очень хотелось бы иметь пример работающего курсора в Sybase ASA 6, потому что рано или поздно я столкнусь с чем-то, что я не могу легко развернуть. Так что я выброшу это за вознаграждение - может кто-то дать мне рабочий пример? : -)

1 Ответ

1 голос
/ 02 января 2010

Звучит так, как будто вы ищете триггер 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
...