触发器基础

一、触发器
1.概念:触发器是一个在修改指定表中的数据时执行的存储过程。经常通过创建触发器来强制实现不同表中的逻辑相关数据的引用完整性或一致性。由于用户不能绕过触发器,所以可以用它来强制实施复杂的业务规则,以此确保数据的完整性。触发器定义在某个创建的表上也可以定义在一个数据库上。
2.触发器和存储过程的区别:
(1)触发器主要时通过事件进行触发而被执行的
(2) 存储过程可以通过存储过程名字而被直接调用
二、为什么要使用触发器
1.优点:
(1)触发器自动执行,它们在表的数据作了任何修改之后立即激活
(2)触发器可以通过数据库中的相关表进行层叠更改。这比直接把代码卸载前台的做法更安全合理
(3)触发器可以强制限制,这些限制比用CHECK约束所定义的更复杂。与CHECK的约束不同的是,触发器可以引用其他表中的列。
2.功能:维护数据的安全性

三、触发器的种类
1.DDL触发器:针对数据库 ,在创建一个表或者修改,删除时会触发DDL这样一个触发器,这个触发器可以防止对数据库架构进行某些更改,希望数据库中发生某种情况以响应数据库架构中的更改,要记录数据架构中的更改或者事件。
2.DML触发器:数据操作语言,它包含三种触发器分别是:
(1)INSERT触发器
(2)UPDATE触发器
(3)DELETE触发器
四、触发器的创建
1.INSERT触发器
(1)语法格式

```handlebars
> CREATE TRIGGER trigger_name  ON{table|view} {  ~   
> {{FOR|AFTER|INSTEAD OF}
>       {[DELETE] [,] [INSERT] [,] UPDATE]}
>          AS 
>          sql_statement
>           }
>       }

注:on指在一个数据表或视图上创建触发器
{undefined{FOR|AFTER|INSTEAD OF} 表示一个触发的类型
{[DELETE] [,] [INSERT] [,] UPDATE]} 表示触发种类
在设计好触发器之后就可以在数据表中插入一条insert语句,来查询数据表信息。
![在这里插入图片描述](https://img-blog.csdnimg.cn/74666e71b759408795afd6f48afec4f4.png)

如图,在插入数据之前是18条,插入之后变成了19条。

2.DELETE触发器
(1)在DELETE触发器代码内,可以引用一个名为OLD(不区分大小写)的虚拟表,来访问被删除的行。
(2)语法格式


```handlebars
>  CREATE TRIGGER T_DELETETEACHER  
>  ON+信息表  
   AS 
>       SELECT 原有的信息 AS 别删除的信息  FROM  DELETE(临时表)保存刚刚删除的记录

执行操作之后删除某个信息
语语法格式

DELETE FROM +信息表 WHERE+ 列信息

3.UPDATE触发器
当触发器涉及对触发表自身的更新操作时,只能用BEFORE UPDATE 触发器,而AFTER UPDATE触发器将不被允许。
(1)语法格式
CREATE TRIGGER t_UPDATE
ON+信息表
for update
as
if (update(列信息) or update(列信息))
begin
print‘事务不能被处理,基础数据不能修改!’
POLLBACK TRANSACTION
end
else
print’数据修改成功’

注:当提示 “ print‘事务不能被处理,基础数据不能修改!’ ”时,我们就需要用批处理语句回滚整个事务。此时就可以用POLLBACK TRANSACTION 语句表示回滚操作。

4.DDL触发器(数据定义语言)
语法格式

> CREATE TRIGGER trigger_name   
> ON  {ALL | SERVER | DATABASE}
> WITH ENCRYPTION
>  {FOR] [AFTER] { event_type}
>  AS 
>  sql_statement

注:ON后面加参数

四、管理触发器
管理触发器也就是修改,删除,启用,禁用等触发器,在管理触发器时首先要找到它,找到之后可以进行自己想要执行的操作。

五,嵌套触发器
通过嵌套触发器改变其他表上的数据,进行多个表的操作。
语法格式:一下就是两个表的嵌套。

> create trigger  t_del on +新的信息表 for delete  as 
>  
>        insert into +原有信息表(信息表中的列)
>        select + 原有信息表中的列名
>        for deleted create
>    
> create trigger t_add
> on +信息表
>  for insert 
>  as 
>  
>    update +另一个信息表  set +列名=列名+1
>    where 另一个列=(select 当前列 +from inserted)

六、递归触发器
任何触发器都可以包含影响同一个或另一个表的UPDATE, INSERT或DELETE语句,如果启用递归触发器选项,那么改变表中数据的触发器,通过递归执行就可以再次触发自己,在数据创建时,默认情况下递归触发器选项是禁用的,但可以使用 ALTER DATADASE语句来启用它。
在这里插入图片描述

用图可以清晰的看出触发器递归的操作。
在使用触发器时还有些注意事项:
1.触发器既有复杂性,可以用它来解决诸如自引用关系这样发杂关系。使用递归触发器时,需要考虑一下事项和原则:
(1)递归触发器很复杂,必须经过有条理的设计和全面的测试。
(2)在任意掉的数据修改会触发一系列触发器。尽管提供处理复杂关系的能力,但是如果表要求以特定的顺序更新用户时,使用递归触发器就会产生问题。
(3)所有触发器一起构成一个大事务,任何触发器中的任何位置上的ROLLBACK命令都将取消所有数据输入。所有数据均被擦除,并且无任何数据将被放到列表中。
(4)触发器最多只能递归16层,换句话说,如果递归链中的第16个触发器激活了第17个触发器,则结果与发布ROLLBACK命令一样,所有数据将被擦除。
原文链接:https://blog.csdn.net/yyp0304Devin/article/details/81077692

触发器中的Inserted表和Deleted表:
Inserted表和Deleted表。此二表仅仅触发器运行时存在。

一旦某一个触发器结束执行时,相应的在两个表内的数据都会丢失。你可以使用该两个

表来精确地确定触发触发器的动作对数据表所做的修改。比如,通过检查Deleted表,

你可以确定那些记录由某一动作删除。

Inserted 表用于存储 INSERT 和 UPDATE 语句所影响的行的副本。在一个插入或

更新事务处理中,新建行被同时添加到 inserted 表和触发器表中。Inserted 表中的行是

触发器表中新行的副本。

Deleted 表用于存储 DELETE 和 UPDATE 语句所影响的行的复本。在执行 DELETE

或 UPDATE 语句时,行从触发器表中删除,并传输到 deleted 表中。Deleted 表和触发

器表通常没有相同的行。

1.插入操作(Insert) Inserted表有数据,Deleted表无数据
2.删除操作(Delete) Inserted表无数据,Deleted表有数据
3.更新操作(Update) Inserted表有数据(新数据),Deleted表有数据(旧数据)

代码实例:

set QUOTED_IDENTIFIER ON
go

ALTER TRIGGER [dbo].[updatestart]
ON [dbo].[OrderTelecom] FOR update
AS
BEGIN

DECLARE @state int;
DECLARE @note2 varchar(50)

SELECT  @state= Inserted.ortState,@note2 =Inserted.ortNote2 from Inserted

IF @state=1 AND @note2=1
 begin
    --当发短信猫取走记录时修改状态为成功和取过的状态
  update OrderTelecom set OrderTelecom.ortState=2 ,OrderTelecom.ortSmsmessages='短信充值成功'
  from OrderTelecom inner join Inserted on OrderTelecom.ortId=Inserted.ortId 
 end
 
 if @state in(2,3,10) and @note2=0
  begin
  update OrderTelecom set ortNote2=1
  from OrderTelecom inner join Inserted on OrderTelecom.ortId=Inserted.ortId 
 end

END

转自: http://www.cnblogs.com/sufei/archive/2009/05/23/1487500.html

触发器OLD和NEW区别:
:new --为一个引用最新的列值;
:old --为一个引用以前的列值;

这两个变量只有在使用了关键字 "FOR EACH ROW"时才存在,且update语句两个都有,而insert只有:new ,delete 只有:old;

在这里插入图片描述

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值