<span style="font-family: verdana, Arial, helvetica, sans-seriff; background-color: rgb(255, 255, 255);"> </span><span style="font-family: verdana, Arial, helvetica, sans-seriff; background-color: rgb(255, 255, 255);"> 触发器是一种特殊的存储过程﹐它不能被显式地调用﹐而是在往表中插入记录﹑更新记录或者删除记录时被自动地激活。所以触发器可以用来实现对表实施复杂的完整性约束。</span>
触发器是用户定义在关系表上的一类由事件驱动的特殊过程。一旦定义,任何用户对表的增删改操作操作均由服务器自动激活相应的触发器,在DBMS核心层进行集中的完整性控制。触发器类似于约束,但是比约束更加灵活,可以实施比foreign key约束、check约束更为复杂的检查和操作,具有更精细和更强大的数据控制能力。
SQL Server为每个触发器都创建了两个专用表﹕Inserted表和Deleted表。这两个表由系统来维护﹐它们存在于内存中而不是在数据库中。这两个表的结构总是与被该触发器作用的表的结构相同。触发器执行完成后﹐与该触发器相关的这两个表也被删除。 Deleted表存放由于执行Delete或Update语句而要从表中删除的所有行。 Inserted表存放由于执行Insert或Update语句而要向表中插入的所有行。
SQL Server2000提供了两种触发器﹕Instead of 和After 触发器。
Instead of触发器用于替代引起触发器执行的T-SQL语句。除表之外﹐Instead of 触发器也可以用于视图﹐用来扩展视图可以支持的更新操作。
After触发器在一个Insert,Update或Deleted语句之后执行﹐进行约束检查等动作都在After触发器被激活之前发生。After触发器只能用于表。一个表或视图的每一个修改动作(insert,update和delete)都可以有一个instead of 触发器﹐一个表的每个修改动作都可以有多个After触发器。
触发器的执行过程 如果一个Insert﹑update或者delete语句违反了约束﹐那幺After触发器不会执行﹐因为对约束的检查是在After触发器被激动之前发生的。所以After触发器不能超越约束.
*创建触发器
create 触发器名
on 表名
for insert/delete/update
as
begin transaction
*删除触发器
drop trigger trigger_name
举个例子:两张表,物料剩余总量和物料领用记录,物料领用记录表每插入一条数据之前需要检查物料剩余总量表中是否有该种物料,如果有还要检查余量是否满足领用需求,满足领用条件之后,领用后还得同步修改物料剩余总量表中该物料的剩余量。
create trigger T_物料领用记录
on 物料领用记录
for insert
as
begin transaction
if not exists(
select 物料名
from 物料剩余总量
where 物料名 in(select 物料名 from inserted)
)
begin
raiserror('错误,仓库中不存在该物品',16,1)
rollback
return
end
if exists(
select 剩余量
from 物料剩余总量
where 物料名 in (select 物料名 from inserted)and 剩余量 <=0
)
begin
raiserror('剩余不足,不能领用',16,2)
rollback
return
end
declare @物料名 char(10)
set @物料名 = (select 物料名 from inserted)
declare @领用数量 smallint
set @领用数量 = (select 领用数量 from inserted)
update 物料剩余总量
set 剩余量 = 剩余量 - @领用数量
where 物料名 = @物料名
commit transaction
go