有朋友问,“你是不是在写论文?”
(此处请想象个表情)“好吧,论文继续!”
SQL中,触发器可以看成是一种特殊的存储过程,使用inserted临时表来建立数据关联。Windev中,触发器实质上是调用过程Procedure,所以基本上所有事情都可以做,非常*,通过H.File或Myfile函数,直接获取当前触发的数据表及其当前记录,不需要依靠中间表inserted。同时,SQL中每个数据操作只能设置一个触发器,而windev没有限制。从这三点看,算是秒了SQL吗?
说回windev的触发器。
windev的触发器,有两种,一种是Client Trigger,在客户端触发,另外一种是Server Trigger,在服务端触发。下面重点说说这两者的区别:
1、Client Trigger:客户端触发,HFSQL C/S和经典模式,以及外部数据库都可以使用,触发全局过程,本质上是函数触发(HAdd/HModify/Hdelete/HWrite/HCross,Table类隐式转换为前者,不需要理会)。因为是函数触发,所以程序中直接使用SQL的insert/update/delete等操作,不会触发,比如update类的query就不能触发,直接写的SQL代码(编辑数据类)也不能触发,这是限制。好处是,因为是调用全局过程,所以绝大多数函数都可以使用,非常灵活。定义触发器和全局过程,都需要撸代码。同时,如果触发数据操作,需要赋值后,再使用HAdd等函数操作。
2、Server Trigger:服务端触发,HFSQL经典模式下不能使用,触发服务端的存储过程,本质上是数据表操作触发,如insert/update/delete等操作,所以触发上没有任何限制。但因为是触发存储过程,所以存储过程的函数限制一样适用于它。比如gpwGetUserInfo这样的客户端当前用户信息函数,就不能使用,所以你只能拿到数据表的用户信息,或者当前电脑的IP地址,这是服务端触发器的限制。定义触发器可以通过编辑器,存储过程需要撸代码。同时,应该是在服务端,所以如果触发数据操作,直接赋值就可以,不需要HAdd等函数操作。
以上是两者最主要的区别,其它使用都差不多。最后说一下,客户端触发,如果触发的是HAdd等操作,且目标数据表也有触发器,如何避免死循环?前文中有说,客户端触发,本质上是函数触发,所以如果能够避免使用HAdd/HModify/Hdelete/HWrite/HCross,以及tableadd/tablesave等函数,又实现数据表操作,就能避免死循环。windev提供这样的功能吗?自然是提供的,这里卖个关子。有需要的,请关注并留言联系哦!
PS:目前我的系统日志Log,全部转到触发器。因为系统自带的Log,推测应该是服务端Log,所以无法获取应用当前操作用户,只能拿到数据表用户或机器IP。