| 发表于:2007-04-06 13:40:2411楼 得分:0 |
大侠!能不能用两个示例详细说明一下以下两种方式: 小弟不盛感激!!!!! 1.instead of触发器用于替代引起触发器执行的t-sql语句。可用于表和视图。 2.after触发器在一个insert、update或delete语句之后运行,进行约束检查等动作都将在after触发器被激活之前发生。只可用于表。 --------------------------------------------------- 好的。 (1)instead of触发器实例 在视图上可以创建instead of触发器,而且如果定义视图的查询语句中有要导出的列,只能通过instead of触发器对其进行更新,本例就将介绍instead of触发器是如何更新有导出列的视图的。 以customers表为基表创建一个视图simplecustomers,该视图包含客户的简单信息,比如客户姓名、城市、电话。其中,客户姓名是由customers表中的客户姓(lastname)和名(firstname)列连接得到的列。 创建simplecustomers视图的代码如下: create view simplecustomers (customername,city,tel) as select firstname+ ', '+lastname,city,tel from customers 为了能通过simplecustomers视图向customers表添加记录,可以定义如下的触发器: create trigger insertcustomer on simplecustomers instead of insert as declare @name varchar(40) declare @firstname varchar(20) declare @lastname varchar(20) declare @city varchar(20) declare @tel varchar(20) declare @idx int select @name = customername,@city = city,@tel = tel from inserted set @idx = charindex( ', ',@name) set @firstname = left(@name,@idx-1) set @lastname = right(@name,len(@name)-@idx) insert into customers(firstname,lastname,city,tel) values(@firstname,@lastname,@city,@tel) 说明:当向simplecustomers视图执行insert语句时,insertcustomer触发器被触发,这时inserted表中已经有了要插入的数据,在insertcustomer触发器的代码中,分析插入的客户姓名字符串,将其分拆为姓和名两个字符串,并插入基表customers,而原来的insert语句不会被执行。 (2)after触发器实例 在orders表上建立一个插入触发器,在添加一个订单时,减少goods表相应货品记录中的库存量。 create trigger orderinsert2 on orders for insert as update goods set storage = storage - inserted.quantity from goods,inserted where goods.name = inserted.goodsname | | |
|