У меня есть пара триггеров в базе данных 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, такой же, как и в другом случае, - которая не запускает триггер.
Возможно, есть что-то в том, как обрабатываются транзакции, что я не понимаю?