数据库——触发器

在学习了数据库之后我们又接触到了一个新的对象——触发器,我们通常把触发器称为特殊的一个存储过程。什么是触发器呢?它是干什么用的,它和之前见过的触发器有什么区别,下面就让我们一起看看。

一、触发器

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)语法格式


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

注:on指在一个数据表或视图上创建触发器
{{FOR|AFTER|INSTEAD OF} 表示一个触发的类型
{[DELETE] [,] [INSERT] [,] UPDATE]} 表示触发种类
在设计好触发器之后就可以在数据表中插入一条insert语句,来查询数据表信息。这里写图片描述
如图,在插入数据之前是18条,插入之后变成了19条。

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


>  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命令一样,所有数据将被擦除。

PS:看一遍有不一样的收获,学习就是不断重复的过程,在看完第一遍时没有什么影响,看完第二遍就好多了,有总结的错的地方还请指出。

猜你喜欢

转载自blog.csdn.net/yyp0304Devin/article/details/81077692