курсоры Sybase в триггере - PullRequest
       27

курсоры Sybase в триггере

1 голос
/ 15 февраля 2012

Я пытаюсь использовать курсор в триггере в системе 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.Кто-нибудь может найти решение для этого?Это может быть ошибка?Есть ли обходные пути для курсора?

Спасибо за любой совет

Ответы [ 2 ]

0 голосов
/ 30 апреля 2013

Если повторение триггера не составляет проблемы при каждом изменении таблицы (добавление / удаление столбцов), вы можете просто сгенерировать тело для триггера с таким запросом

select 
'if update('+c.name+')
   set @colname = '''+c.name+'''
'
from syscolumns c where id = object_id('my_table')
0 голосов
/ 17 февраля 2012

Проблема в том, что update(@colname) это что-то вроде update('colname') и должно быть update(colname).Чтобы достичь этого, вам нужно использовать Dynamic SQL .

Я уже видел документацию и возможно использовать:

Динамическое выполнение Transact-SQL

При использовании с параметрами строки или char_variable команда execute объединяет предоставленные строки и переменные для выполнения результирующей команды Transact-SQL.Эта форма команды execute может использоваться в пакетах, процедурах и триггерах SQL.


Проверьте в этой статье для примера использования динамического sql!

...