【发布时间】:2011-06-16 19:51:17
【问题描述】:
我在 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)进行更新。发生这种情况时,每个触发器都会触发一次(一次用于 Docs,一次用于 Trans)并且一切都按预期工作。
在另一种情况下,这些表在 Sybase 事务中通过两次数据库更新进行更新。在这里,第一次更新是通过调用应用程序中的内联 SQL 完成的(触发 Trans 触发器)。第二次更新是通过存储过程 - Insert_Docs_SP 完成的,与另一种情况相同 - 它不会触发触发器。
也许我不理解交易的处理方式?
【问题讨论】:
标签: sql stored-procedures triggers sap-ase