Вызов sproc для каждой затронутой записи из триггера в Sybase ASA 6

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

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

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

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

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


person robsoft    schedule 21.12.2009    source источник
comment
Почему бы просто не включить логику в ваш процесс вставки, чтобы тот процесс, который вы пытаетесь реализовать, вызывался после оператора INSERT?   -  person OMG Ponies    schedule 21.12.2009
comment
@OMG Ponies - к сожалению, я не контролирую все методы, с помощью которых можно изменить таблицу (есть и другие приложения, связанные с этой базой данных, а также мое). Мы хотим использовать триггер, чтобы гарантировать, что независимо от того, как изменяется таблица, sproc всегда будет вызываться и поддерживать различные другие биты системы «в актуальном состоянии». До сих пор они вручную запускали задания в конце дня, но им хотелось чего-то более «реального времени». :-)   -  person robsoft    schedule 21.12.2009
comment
База данных не работает в лучшем случае, если вы запускаете их во время выполнения. Кроме того, использование курсоров в триггерах — это не то, что вам нужно. Если некоторые из наших разработчиков или администраторов баз данных захотят создать триггеры с курсорами, init будет вызван обратно, потому что мы не допускаем использование курсоров в триггерах. Это вызовет большое отставание.   -  person pipelinecache    schedule 29.12.2009
comment
Почему бы не показать код, который не работал, и объяснить, что произошло, когда он запустился? Может кто укажет на ошибку. Кроме того, я сомневаюсь, что многие люди (если вообще кто-либо) попытаются написать для вас цикл курсора Sybase ASA 6.0.4 с нуля.   -  person KM.    schedule 30.12.2009
comment
Привет КМ. У меня нет неработающего кода как такового — просто каждый пример, который я нашел в Интернете, просто не работает на ASA 6. Я не знаю, мой ли это (вероятно!) но в основном примеры кода даже не «компилируются». Я вернусь и найду несколько примеров/ссылок (с веб-сайта Sybase) и проиллюстрирую их дальше. Я не прошу никого исправить мою проблему (на самом деле у меня сейчас ее нет) - я просто хочу найти кого-то, кто делал курсор в этой версии ASA, кто может показать мне правильное заклинание, чтобы оно скомпилировалось. . :-)   -  person robsoft    schedule 30.12.2009


Ответы (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
person Gabriel McAdams    schedule 02.01.2010
comment
Спасибо, Габриэль - я не оценил, что могу писать триггеры ROW LEVEL вместо триггеров уровня операторов. Я больше знаком с работой на ROW LEVEL (из триггеров Interbase 6), и я рад, что могу использовать эту технику, чтобы избежать курсоров. Вы получаете награду; ваше предложение сработало в моей базе данных здесь, и я буду рад использовать этот подход в будущем. Большое спасибо! - person robsoft; 04.01.2010