关于触发器的应用 TQ   昨天看《精通MS SQL SERVER 7.0》,一不小心看到一个屏蔽/恢复触发器功能的命令,以前看MS SQL SERVER在线帮助及手册的时候一直没注意(嘿嘿,也怪那些书和手册写得不好^_^)。在PB中调用方式如下: EXECUTE IMMEDIATE "ALTER TABLE TableName ENABLE TRIGGER"; EXECUTE IMMEDIATE "ALTER TABLE TableName DISABLE TRIGGER"; 红色字体TableName需要改正您自己的表名 通常使用触发器以下有几个用途: 1.保证数据完整性(例如删除一张基础数据表的同时,需要检查是否有其他相关业务发生表用到此数据,如果用到则不允许删除) 2.保持合计值的更新(例如一张入库单由多条明细记录组成,表头(入库单)需要有合计数量和金额,这样在表体(明细记录)的Table增加触发器来合计值并更新表头Table。 3.检查数据值的合法性。   虽然有很多好外,但有时带来的麻烦是,例如需要通过程序批量恢复部分表中丢失的数据(不是手工一条条输入)或删除某些数据,如果触发器存在会造成数据不一致或数据无法导入(或删除)情况。需要先屏蔽触发器,等工作完成后再恢复状态。 特别说明的是:如果屏蔽触发器会造成该表的触发器暂时失效,在一个运行在网络上的多用户MIS系统来说要特别小心,因为这样很有可能造成其他工作站所用系统的数据没有完整按事先的设计来保存数据,所以屏蔽触发器的同时应该采取相应手段来防止其他用户同时使用系统。例如可以在数据库中增加表来设置标志位,进入相关模块的读取此标志。 例如:可增加一张Table: 表1 模块名 使用计数 是否禁用 订单输入 3 0 发货单输入 2 0 表结构说明:表1只是说明用法,所以字段用中文名,各位实际使用时需要相应改动。“使用计数”表示有多少人正在使用此模块,可以在进入此模板的Window open事件中增加代码来累加此值,并在退出模板时扣除此计数。(没有考虑到非法退出系统或断电情况,可以用winstock来实现或简单的允许系统的管理员对此表进行修正来实现,随便说一下,系统的管理员也可以用PC Anywhere 9.0对整个网络的每台计算机查看,来看看每台电脑上运行的系统) “是否禁用”表示当前此模块是否可以使用,在相应open相应模板的Window之前先读取此字段来判断,如果禁用则提示用户系统正在进行备份/恢复工作(或其他),不允许进入操作。 下面代码是演示在希望暂时屏蔽触发器的时候进行的操作代码模板: Integer li_state Select 状态 into :li_state From 表1 Where 模块名 = "订单输入" If li_state > 0 Then MessageBox("提示", "因为现在订单输入模块还有" + String(li_state) + "人正在使用,你不能屏蔽触发器!") Return End If Update 表1 Set 是否禁用 = 1 Where 模块名 = "订单输入"; Commit; SQLCA.Autocommit = TRUE EXECUTE IMMEDIATE "ALTER TABLE 订单Table ENABLE TRIGGER"; SQLCA.Autocommit = FALSE ...... 进行相应处理代码 ...... SQLCA.Autocommit = TRUE EXECUTE IMMEDIATE "ALTER TABLE 订单Table DISABLE TRIGGER"; SQLCA.Autocommit = FALSE Update 表1 Set 是否禁用 = 0 Where 模块名 = "订单输入"; ....... Commit: