触发器的分类
DML触发器是响应Insert、Update、Delete语句,DDL是响应Create、Alter、Drop开头的数据定义语句而激活的。
1.触发器的概念:就是在数据库进行insert、delete、update时会触发我们规定的的一系列的动作
创建一个简单的触发器1
2
3
4
5
6create trigger tgr_name --触发器的名称
on table_name --触发器作用的表名
for insert --触发的操作
as
print '我添加了一条记录哦'
go
2.获取触发器触发是操作的数据
触发器有两个特殊的表,新插入的数据表(inserted)和删除的数据表(deleted),这两张表只能读去数据,不能修改数据。inserted表存放插入和修改后的数据,deleted表存放删除和修改前的数据。
注意:数据库版本为sqlserver 2018 R2,如果一次操作多条数据,inserted和deleted会存放多条数据的信息1
2
3
4
5
6
7
8create trigger OrderDetail_Update
on OrderDetail
after update
as
begin
if(update(je))--列级触发器,当金额改变时触发
insert into OrderDetailTz select newid() id,* from deleted --获取插入前的数据插入到调整表当中
end
3.After 与Instead Of
Instead Of触发器与After触发器的工作流程是不一样。
After触发器是在SQLSERVER服务器接到执行SQL语句请求之后,先建立Inserted和Updated临时表,然后在更改物理表上的数据,最后才激活触发器程序。
而Instead Of触发器在SQLSERVER服务器接到执行SQL语句请求,建立Inserted和Updated临时表后就激活了Instead Of触发器程序,至于SQL语句的请求如何操作数据就不在管了,把执行权全权叫给了Instead Of触发器。
Instead Of触发器实例1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17Create Trigger OrderDetail_Insert
ON OrderDetail
Instead Of Insert
AS
Begin
Set Nocount On; /*屏蔽触发器里Insert语句执行完后返回的所影响的行数的消息*/
Declare @Orderid int,@Price money,@discount real
select @OrderId=OrderId,@Price=Price,@Discount=Discount from Inserted
if(@Discount)>0.6
begin
print '折扣不能大于0.6'
end
else
begin
insert into OrderDetail(OrderId,Price,Discount) values(@OrderId,@Price,@discount)
end
End