2011-03-08 68 views
0

我得到“AFTER'附近的语法错误。”试图创建下面Sybase - 创建TRIGGER时出现语法错误

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 

触发时,请帮

+0

这看起来像一个'oracle'触发。 – 2011-03-08 04:57:09

回答

0

这看起来像一个触发了Sybase的SQL Anywhere的产品。特别使用Watcom SQL方言。

跳出来的一件事就是你错过了订单声明。看到你的语句所包含的顺序条款等

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,则返回错误。

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

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

此外,你可能想看看新的论坛上表示Sybase搭建类似于计算器...

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

它的下降是问题的地方特定于Sybase SQL Anyhwere产品线。

希望这可以帮助你一些。

0

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

我目前面临着同样的问题,我的版本的Sybase和寻找解决办法...

最好的问候, vfrrjq

相关问题