Я пытаюсь использовать курсор в триггере в системе Sybase ASE 15.0.3, работающей в Solaris.Цель этого состоит в том, чтобы я хотел знать, какой столбец таблицы обновляется.Затем эту информацию я сохраняю в таблице администрирования для дальнейшего поиска.
create trigger test_trigger on my_table for update as
set nocount on
/* declare cursor */
declare @colname varchar(64)
declare column_name cursor for
select syscolumns.name from syscolumns join sysobjects on (sysobjects.id = syscolumns.id) where sysobjects.name = 'my_table'
/* open the cursor */
open column_name
/* fetch the first row */
fetch column_name into @colname
/* now loop, processing all the rows
** @@sqlstatus = 0 means successful fetch
** @@sqlstatus = 1 means error on previous fetch
** @@sqlstatus = 2 means end of result set reached
*/
while (@@sqlstatus != 2)
begin
/* check for errors */
if (@@sqlstatus = 1)
begin
print "Error in column_names cursor"
return
end
/* now do the insert if colum was updaed */
if update(@colname)
begin
insert into my_save_table (login,tablename,field,action,pstamp)
select suser_name(),'my_table',@colname,'U',getdate() from inserted
end
/* fetch the next row */
fetch column_name into @colname
end
/* close the cursor and return */
close column_name
go
К сожалению, при попытке запустить ее в isql я получаю следующую ошибку:
Msg 102, Level 15, State 1:
Server 'my_sybase_server', Procedure 'test_trigger', Line 34:
Incorrect syntax near '@colname'.
Я провел некоторые исследования иобнаружил, что строка 34 означает следующее утверждение:
if update(@colname)
, затем я попытался просто проверить 1 столбец и заменить его на
if update(some_column_name)
Это на самом деле работает нормально, и я неесть другая идея, как это исправить.Похоже, функция update () как-то не позволяет содержать переменную.Я не нашел никакой дополнительной информации ни о книгах sybase, ни где-либо еще в Google ect.Кто-нибудь может найти решение для этого?Это может быть ошибка?Есть ли обходные пути для курсора?
Спасибо за любой совет