Sybase的Trigger问题

天上人间 2011-10-28 11:26:55
有个难题想大家帮我一下.
我在表TABLE_MASTER里建了个update trigger,其中一个功能是做log记录,如下:


CREATE TRIGGER dbo.TRG_UPD_TABLE_MASTER on TABLE_MASTER for UPDATE
AS
BEGIN TRAN UPD_TABLE
/* --SQL STATEMENT---*/
IF UPDATE(STATUS)
BEGIN
INSERT INTO TABLE_MASTER_LOG(A,B,C,D,E)
SELECT A,B,C,D,E FROM inserted
END
/* --SQL STATEMENT --*/

COMMIT TRAN UPD_TABLE
RETURN



目前遇到的问题是,我的日志表的插入动作成功与否不能影响主表的更新,即TABLE_MASTER_LOG出现INSERT失败,不管是什么错误,能直接跳过该错误,继续执行后续的语句。
我试过在INSERT那段也加个TRANSACTION,但是也是会回滚主表的更新动作。

谁有好的思路分享一下,谢谢。。。
...全文
152 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
wwwwb 2011-11-02
  • 打赏
  • 举报
回复
可以的,我测试的时候就是出错也不会退出SP
SYBASE在SP(存储过程)中可以捕获错误?
类似
DECLARE ... HANDLER FOR ...;
愿闻其详
wwwwb 2011-11-02
  • 打赏
  • 举报
回复
能否共享一下?
TBNoO 2011-11-01
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 wwwwb 的回复:]
放弃这个想法吧,
Sybase没有办法进行异常处理,而且procedure中的任何错误,会导致整个procedure直接退出,
[/Quote]

这句话是错误的,ASE是可以捕获错误码的,其中sysmessages就是记载了错误码信息的系统表,我还专门写了一个存储过程,来测试捕获错误码,并测试成功了。

LZ可以参考9楼的想法,写存储过程,利用事务进行log日志的记录,往这个方向思考下。
TBNoO 2011-11-01
  • 打赏
  • 举报
回复
可以的,我测试的时候就是出错也不会退出SP(PS:是否指存储过程procedure?),山人自有妙计。

[Quote=引用 13 楼 wwwwa 的回复:]
引用 11 楼 badyflf 的回复:
引用 8 楼 wwwwb 的回复:
放弃这个想法吧,
Sybase没有办法进行异常处理,而且procedure中的任何错误,会导致整个procedure直接退出,


这句话是错误的,ASE是可以捕获错误码的,其中sysmessages就是记载了错误码信息的系统表,我还专门写了一个存储过程,来测试捕获错误码,并测试成功了。

LZ可以参考9……
[/Quote]
WWWWA 2011-11-01
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 badyflf 的回复:]
引用 8 楼 wwwwb 的回复:
放弃这个想法吧,
Sybase没有办法进行异常处理,而且procedure中的任何错误,会导致整个procedure直接退出,


这句话是错误的,ASE是可以捕获错误码的,其中sysmessages就是记载了错误码信息的系统表,我还专门写了一个存储过程,来测试捕获错误码,并测试成功了。

LZ可以参考9楼的想法,写存储过程,利用事务进行log日志……
[/Quote]
我的意思是 Sybase没有办法进行异常处理,出错会退出SP,你有办法吗?
WWWWA 2011-11-01
  • 打赏
  • 举报
回复
ASE是可以捕获错误码的
是用@ERROR?在SP中可以捕获错误吗?类似
DECLARE ... HANDLER FOR ...;
愿闻其详
iihero 2011-10-29
  • 打赏
  • 举报
回复
把insert那段写成另一个存储过程就解决了,利用其返回值,决定回滚还是继续。
WWWWA 2011-10-29
  • 打赏
  • 举报
回复
放弃TRIGGER,用2个SP来完成,主表、子表分别INSERT
wwwwb 2011-10-28
  • 打赏
  • 举报
回复
ase无法捕获错误
天上人间 2011-10-28
  • 打赏
  • 举报
回复
真实的业务环境确实需要这样做,因为这是一个专门查看的表(不一定是日志表),但这表的INSERT必须不能影响主表的更新操作。
我知道要考虑到数据的完整性,但是我这表的作用是查看实时数据(这个实时数据可以接受失败),但每天晚上也会对该表做一次清空和根据主表的数据重新生成。
而在UDPATE TRIGGER这里加上这个INSERT就是为了能及时捕捉到实时数据,并加以分析和处理。
WWWWA 2011-10-28
  • 打赏
  • 举报
回复
ASA中有EXCEPTION 捕获错误
WWWWA 2011-10-28
  • 打赏
  • 举报
回复
从数据完整性角度讲,不建议这样做

在ASE中似乎尚须 捕获错误的代码 ,只能通过事务
IF @ERROR<>0 THNE ROLLBACK
wwwwb 2011-10-28
  • 打赏
  • 举报
回复
放弃这个想法吧,
Sybase没有办法进行异常处理,而且procedure中的任何错误,会导致整个procedure直接退出,
天上人间 2011-10-28
  • 打赏
  • 举报
回复
但用事务的话,会导致整个trigger都无法提交啊.
wwwwb 2011-10-28
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 gzhujus 的回复:]
我的是ASE 15的,那就是说不能实现这样的功能?
[/Quote]
对,还是用事务吧
天上人间 2011-10-28
  • 打赏
  • 举报
回复
我的是ASE 15的,那就是说不能实现这样的功能?

2,596

社区成员

发帖
与我相关
我的任务
社区描述
Sybase相关技术讨论区
社区管理员
  • Sybase社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧