快生三星了,好歹也得在CSDN上留点什么以示水平不低吧,但总是不知道该写什么,只善于回答问题,不善于总结问题。
近来在坛子上经常看到有问触发器的,而且大多是要求实现在一定条件下不向表中进行操作的触发器,可大多数都不知道该用 INSTEAD OF 触发器。
实现在一定条件下不向表中进行操作的触发器也可以用 AFTER | FOR 触发器,方法是对系统临时表 inserted 表或者 deleted 表进行检查,发现不能操作的,便用 ROLLBACK 对表进行回滚。但是这种操作是有点问题的,一是如果同时进行其他操作的话,可能会被一起回滚,二是有点脱什么放什么的嫌疑,先干了,发现不行,再回退,是不是很好笑!
其实 INSTEAD OF 触发器是解决这类问题的最好办法。在对表进行操作时,总会产生 INSERTED 和(或)DELETED表,不管这个操作是否已经进行。这里的和/或,要看进行的什么操作,插入,产生 INSERTED 表,删除,产生DELETED表,而update则两个都会产生。
行了,实际的编程思想是这样的。。。
如果不满足条件就不能插入,好,用 INSTEAD OF 触发器,利用 INSERTED 表先检查是否满足条件,如满足条件,那就只要: insert into 目标表 select * from inserted 就OK了,否则,可以什么都不做,由插入程序去根据 @@ROWCOUNT判断插入是否成功。当然,也可以用select '提示' 的方法给出提示。</