При каких условиях триггер Sybase не будет вызван? - PullRequest
0 голосов
/ 16 июня 2011

У меня есть пара триггеров в базе данных Sybase ASE, которые запускаются при обновлении двух таблиц: Docs и Trans.

Триггеры определены как показано здесь:

Для документов:

 CREATE TRIGGER dbo.Index_Change_Docs
 ON dbo.docs
 FOR INSERT,UPDATE AS

 IF UPDATE(DOCTYPE) OR UPDATE(BATCH_NO) OR UPDATE(SCANDATE) OR           
 UPDATE(PERIOD_START_DATE) OR UPDATE(PERIOD_END_DATE) 
 OR UPDATE(DISPATCH_ID) OR UPDATE(DISPATCH_NAME) OR UPDATE(CHECKNUM) OR    
 UPDATE(CHECKAMT)
 BEGIN
    INSERT INTO 
    DOCID_SYNC (IS_DOC_ID, CRTN_DT, SYNC_STATUS_CDE) 
    SELECT Inserted.DOCID, GETDATE(), "N" FROM Inserted

 END

Для транс:

 CREATE TRIGGER dbo.Index_Change_Trans
 ON dbo.Trans
 FOR INSERT,UPDATE AS

 IF UPDATE(TRANSNUM) OR UPDATE(CONTRACT) OR UPDATE(FRANCHISE) OR UPDATE(SSN) OR      
 UPDATE(STATE_CODE) OR UPDATE(TRANSTYPE)
OR UPDATE(AGENCYNUM) OR UPDATE(LOCKBOXBATCHNUM) OR UPDATE(PRODUCTCODE) 
 BEGIN

    INSERT INTO 
    DOCID_SYNC (IS_DOC_ID, CRTN_DT, SYNC_STATUS_CDE)
    SELECT DOCID, GETDATE(), "N" FROM DOCS
    WHERE Transnum = (SELECT Inserted.TransNum from Inserted)
 END

Похоже, что поведение этих триггеров отличается в зависимости от того, как обновляются эти таблицы.

В одном случае эти таблицы обновляются с помощью двух хранимых процедур (Insert_Docs_SP и Insert_Trans_SP). Когда это происходит, каждый триггер срабатывает один раз (один раз для документов, один для транс) и все работает как положено.

В другом случае эти таблицы обновляются в транзакции Sybase с двумя обновлениями базы данных. Здесь первое обновление выполняется с помощью встроенного SQL в вызывающем приложении (которое запускает триггер Trans). Второе обновление выполняется с помощью хранимой процедуры - Insert_Docs_SP, такой же, как и в другом случае, - которая не запускает триггер.

Возможно, есть что-то в том, как обрабатываются транзакции, что я не понимаю?

Ответы [ 2 ]

0 голосов
/ 17 июня 2011

Я нашел ответ - это в порядке исполнения.Я думал, что один из триггеров не был запущен - в данном случае триггер Index_Change_Trans - но на самом деле это было.Я не видел результатов, однако, потому что этот триггер полагается на записи в таблице документов.

INSERT INTO 
DOCID_SYNC (IS_DOC_ID, CRTN_DT, SYNC_STATUS_CDE)
SELECT DOCID, GETDATE(), "N" FROM DOCS
WHERE Transnum = (SELECT Inserted.TransNum from Inserted)

Таким образом, в случаях, когда таблица Trans была обновлена ​​до таблицы Docs, запуск триггера Trans не будет отображать обновление в таблице Docid_Sync - поскольку в этот момент в таблице не было записейТаблица документов с соответствующим значением Transnum.В этих случаях таблица Docid_Sync имеет только одну запись, результат триггера документов.

В других случаях сначала обновляется таблица документов, а затем таблица Trans.В этих случаях в таблице Docid_Sync есть две записи - одна как результат триггера документов, а другая как результат триггера Trans.

0 голосов
/ 17 июня 2011

В обоих ваших триггерах триггер вставляется в таблицу docid_sync только при обновлении определенных столбцов. Вы уверены, что хранимая процедура обновляет один из столбцов в триггере? Триггеры также не вызываются, если это рекурсивное обновление от вызова триггера, но здесь это не так.

Другая возможность, если вызывающая транзакция отключила триггер с помощью команды set triggers off. Я хотел бы начать с проверки того, что хранимая процедура обновляет один из столбцов в проверке триггера.

Еще один вопрос: обновляется ли одна и та же строка дважды, во встроенном SQL и хранимой процедуре в случае ошибки, или они обновляют две разные строки?

...