Sybase - 创建TRIGGER时出现语法错误

时间:2011-03-08 04:51:23

标签: sql triggers sybase

我收到“AFTER'附近的语法错误。”当试图创建下面的触发器时

CREATE TRIGGER TR_UPDATE_TEST
AFTER UPDATE OF TEST_NAME
    ON EW_TEST
REFERENCING OLD AS old_data 
NEW AS new_data
FOR EACH ROW
BEGIN
    Insert into EW_TEST_AUDIT (TEST_ID, TEST_NAME_OLD, TEST_NAME_NEW, TEST_ADDRESS_OLD, TEST_ADDRESS_NEW, TEST_MODIFIED_BY_ID, TEST_MODIFIED_DATE)
    Values(old_data.TEST_ID, old_data.TEST_NAME, new_data.TEST_NAME, old_data.TEST_ADDRESS, new_data.TEST_ADDRESS, null, sysdate());
END

请帮忙

2 个答案:

答案 0 :(得分:0)

这看起来像Sybase的SQL Anywhere产品中的触发器。特别是使用Watcom SQL Dialect。

对我而言,有一件事就是你错过了订单声明。请参阅包含订单条款的声明......

CREATE TRIGGER TR_UPDATE_TEST
AFTER UPDATE OF TEST_NAME ORDER 1
ON EW_TEST
REFERENCING OLD AS old_data
NEW AS new_data
FOR EACH ROW
BEGIN
     Insert into EW_TEST_AUDIT (TEST_ID, TEST_NAME_OLD, TEST_NAME_NEW, TEST_ADDRESS_OLD, TEST_ADDRESS_NEW, TEST_MODIFIED_BY_ID, TEST_MODIFIED_DATE)
     Values(old_data.TEST_ID, old_data.TEST_NAME, new_data.TEST_NAME, old_data.TEST_ADDRESS, new_data.TEST_ADDRESS, null, sysdate());
END

当然,ORDER子句是可选的,但是,不知道你在这个表中有什么其他触发器,你很可能会看到在这个表上有多个触发器。如果是这种情况,那么你必须使用ORDER子句。

根据Sybase SQL Anywhere帮助文件...

如果省略ORDER子句或指定0,则数据库服务器会分配顺序1.但是,如果另一个相同类型的触发器已设置为1,则会返回错误。 < / p>

添加其他触发器时,您可能需要修改事件的现有相同类型触发器,具体取决于触发器的操作是否相互作用。如果它们不进行交互,则新触发器的ORDER值必须高于现有触发器。如果他们确实互动,您需要考虑其他触发器的作用,并且您可能需要更改它们触发的顺序。

除此之外,我认为你的触发器中其他一切看起来都很好。也许你可以尝试在表名之前添加表的所有者? dba.EW_TEST(示例)

另外,您可能想查看Sybase提出的与stackoverflow类似的新论坛......

http://sqlanywhere-forum.sap.com/

这是一个删除特定于Sybase SQL Anyhwere产品系列的问题的地方。

希望这对你有所帮助。

答案 1 :(得分:0)

您的Sybase版本很可能不支持AFTER UPDATE触发器。

我目前面临与我的Sybase版本相同的问题并寻找解决方法......

祝你好运, vfrrjq