SQL 触发器

一、什么是触发器?
1、触发器是一个在修改指定表或数据库中的数据时执行的存储过程,
是通过创建触发器来强制实现不同表中的逻辑相关数据的引用完整性或唯一性。
由于操作数据库不能绕过数据库,所以就可以用它来强制实施复杂的业务规则来保证数据的完整性。
2、触发器不同于存储过程,它主要是通过事件的进行而被触发执行的。
而存储过程是可以通过存储过程的命名进行调用。每当对表进行增删改的时候,
sql server就会自动执行触发器定义的sql语句,从而确保对数据的处理必须符合这些sql语句定义的规则。

二、为什么要使用触发器?
1.触发器自动执行,对表或对数据库的数据进行修改拿值等操作就会触发。
2.它可以通过数据库中的相关表进行层叠更改,这比把代码写在前台的做法更安全合理。
3.它也可以强制限制数据的完整性,它的限制比数据库中自带的CHECK约束还要强大和复杂,和CHECK约束不同的是,触发器还可以引用其他表中的列,CHECK约束只是在某个表的某一列加上约束。

三、触发器的种类
1、DDL触发器(针对数据库级别)
1.1.当服务器或者数据库中发生数据的定义语言事件时就会调用DDL触发器,
如果要执行以下操作,就可以使用DDL触发器。
1.1.1.防止对数据库架构的某些内容的更改
1.1.2.防止对数据库中的数据进行删除等操作。
1.1.3.或者记录数据库架构中的事件或修改操作。

2.DML触发器(数据操作)
2.1.DML触发器是当前数据库或者服务器中发生操作语言事件时就会执行的操作。
DML触发器通常分为三种,INSERT(增)触发器、UPDATE(改)触发器、DELETE删(触发器)
2.2.DML触发器可以查询其他表的内容,还可以包含复杂的T-SQL语句。将触发器好触发它的语句作为可在触发器内回滚的单个事务对待,如果检测到错误。则整个事务自动回滚。

四、DML触发器的法语格式

1、触发器的关键字:TRIGGER 

2、NO关键字是:在数据库的某个表或某个视图上创建一个触发器

3、FOR(操作数据的时候触发) | AFTER(执行完操作后才执行这个) | INSTEAD OF(很少用,我也不理解) | 这三个参数是给触发器定义类型用的

4、[DELETE] [,] [INSERT] [,] [UPDATE] 这三个关键字就是对表进行操作的。

5、最后一个就是对触发器数据完整性的T-SQL语句

CREATE TRIGGER triggeer_name
NO{table | veiw}
{
{{FOR | AFTER | INSTEAD OF}
{[DELETE] [,] [INSERT] [,] [UPDATE]}

AS
sql_name
}

}

五、触发器的实例操作(以下都是DML触发器的实例)

1、新增触发器

CREATE trigger T_trigg
on StudentInfo
for insert
as
update Class_size set num = num+1
where id = (select num from inserted)

SQL 触发器_第1张图片

SQL 触发器_第2张图片 

SQL 触发器_第3张图片 

 2、删除触发器

create trigger T_delete
on StudentInfo
for delete
as
select name as 删除名字 from deleted

update Class_size set num = num-1
where id = (select num from deleted)

SQL 触发器_第4张图片

select * from Class_size
delete from StudentInfo where id = '1'
select * from Class_size

 

SQL 触发器_第5张图片

 3、修改触发器

create trigger T_uoadte
on StudentInfo
for update
as
if(update(name) or update(id))
begin
	print'姓名和id不可修改'
	rollback transaction
end
else
	print '修改成功'

SQL 触发器_第6张图片

select * from StudentInfo
update StudentInfo set name = '测试' where id = '2'
select * from StudentInfo

 SQL 触发器_第7张图片

select * from StudentInfo
update StudentInfo set num = '1' where id = '2'
select * from StudentInfo

 SQL 触发器_第8张图片

 六、DDL触发器的法语格式

1.ddl触发器的语法格式(和dml的差不多就是关键字不一样)

CREATE TRIGGER triggeer_name
NO { all server | database}
with encryption
{for | after | {event_type}}
AS
sql_name

2、all server 和 database 的区别就是第一个是针对全部服务器的,后面的是针对数据库

3、 with encryption的话是否对这个触发器的文本进行加密

4、event_type 就是对触发器执行的时候要进行的操作的sql语句

5、最后一个就是对触发器数据完整性的T-SQL语句

七、触发器的实例操作(以下都是DDL触发器的实例)

1、操作数据库

create trigger T_nodelete
on database
for drop_table,alter_table
as
	print '错误,此数据库不能被删除或修改'
	rollback

SQL 触发器_第9张图片

 

drop table cuont

ALTER TABLE cuont
ADD yrr date

SQL 触发器_第10张图片

 

八、管理触发器

--禁用触发器
alter table StudentInfo
disable trigger T_trigg

--启用触发器
alter table StudentInfo
enable trigger T_trigg

--删除触发器
drop trigger T_trigg

SQL 触发器_第11张图片

 

九、嵌套触发器

create trigger t_deletes
on studentInfo2
for delete
as
	insert into studentInfo(student_id,name,num)
	select student_id,name,num
	from deleted

SQL 触发器_第12张图片

create trigger t_add
on StudentInfo
for insert
as
	update Class_size set num = num + 1
	where id = (select num from inserted)

 SQL 触发器_第13张图片

select * from studentInfo2
select * from Class_size
select * from StudentInfo
delete studentInfo2 where id = '1'
select * from studentInfo2
select * from Class_size
select * from StudentInfo

 SQL 触发器_第14张图片

 SQL 触发器_第15张图片

 

十,简单了解递归触发器

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

SQL 触发器_第16张图片

SQL 触发器_第17张图片 

 SQL 触发器_第18张图片

 

一、递归触发器具有复杂特性,可以用它来解决诸如自引用关系这样的复杂关系。使用递归触发器时,需要考虑以下的事项和原则:
1、递归触发器很复杂,必须经过有条理的设计和全面的测试。

2、在任意点的数据修改会触发一系列触发器。尽管提供处理复杂关系的能力,但是如果表要求以特定的顺序更新用户的表时,使用递归触发器就会产生问题
3、所有触发器一起构成一个大事务。任何触发器中的任何位置上的
ROLLBACK命令都将取消所有数据输入。所有数据均被擦除,并且无任何数据将被放到表中。
4、触发器最多只能递归16层。换句话说,如果递归链中的第16个触发器激活了第17个触发器,则结果与发布ROLLBACK命令一样,
所有数据将被擦除。

 注:本内容仅供是本人自己学习参考,如有雷同实属巧合。请给位大佬手下留情啊!!!

 注:本内容仅供是本人自己学习参考,如有雷同实属巧合。请给位大佬手下留情啊!!!

 注:本内容仅供是本人自己学习参考,如有雷同实属巧合。请给位大佬手下留情啊!!!

你可能感兴趣的:(sql,数据库,sqlserver)