IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> SQL学习计划六:学触发器+不难不难 -> 正文阅读

[大数据]SQL学习计划六:学触发器+不难不难

简单来说:

  • 它类似存储过程,但不能调用
  • 发生某个事件时才会开启,并执行指定操作
  • 防止一些恶意或错误操作
  • 可以对一个表上的特定操作,设置多个触发器

DML触发器

就是最常见的触发器啦!具体作用慢慢往下看~~~

准备素材

这里直接拿"SQL学习计划二"的素材:Course表


查看和创建

触发器是针对某一个表进行操作"监视",因此是在表的内部。如下图查看

?这里是触发器的模板,但我们先不用那么复杂

?也可以直接"新建查询"进行编写


?if exists判断

若'trig_cou'触发器已存在则删除

if exists(select * from sysobjects where name = 'trig_cou' and type = 'TR')
	drop trigger trig_cou

简单创建

只要对course表进行插入删除更改,就显示一次course表的内容

create trigger trig_cou				--创建 触发器 名称
	on course						--on 表名
	after insert, delete, update	--after 插入 删除 更改
as									--格式
begin
	set nocount on;					--看批注解释
	select * from course			--触发后的操作
end									--格式
go

批注:set nocount on/off 设置是否返回结果计数,小知识而已

下面只用“添加”来测试,结果成功

--测试结果:添加成功,并显示course表内容
insert into course values('04', '编程', '04')


特殊临时表:inserted和deleted表

执行DML触发器时,会创建inserted表和deleted表,执行完毕就消失!
只能在DML触发器语句中被使用。

  • 执行insert操作:插入的新内容放到inserted表
  • 执行delete操作:删除的旧内容放到deleted表
  • 执行update操作:删除的旧内容放到deleted表,再把新内容放到inserted表

alter修改触发器

这里跟存储过程一样,把"create"改成"alter"即可


回滚

回滚rollback transaction能回滚到操作前,就是取消你刚刚的操作命令。

添加

不允许添加重复课程名
其实吧,在表结构设置约束就行了,哈哈哈

alter trigger trig_cou			--修改 触发器 名称
	on course					--on 表名
	after insert				--after 添加
as								--格式
begin
    declare @nm varchar(10)						--定义一个变量
	select @nm = inserted.cname from inserted	--存放inserted的cname位置的内容
	--这里已经添加新内容进去了
	--若本身存在则次数为1+
	--若本身没有则次数为1
	if (select count(cname) from course where cname = @nm)!=1
		begin
			print 'Error:重复课程名cname'		--提示语
			rollback transaction				--回滚
		end
end;
--测试结果:添加失败,显示提示语,并回滚
insert into course values('11', '语文', '22')

删除

不允许删除有关"编程"科目的记录

alter trigger trig_cou					--修改 触发器 名称
	on course							--on 表名
	after delete						--after 删除
as										--格式
begin
	--if判断,删除的行当中,cname是不是编程
	if exists(select * from deleted where cname = '编程')
		begin
			print 'Error:不能删除编程科目的记录'	--提示语
			rollback transaction					--回滚
		end
end;												--结束
--测试结果:删除失败,显示提示语,并回滚
delete course where C# = '04'

修改

不允许修改教师编号T#字段

alter trigger trig_cou				--修改 触发器 名称
	on course						--on 表名
	after update					--after 修改
as									--格式
begin
	--if判断,是不是修改T#列的内容
	if update(T#)
		begin
			print 'Error:不能修改教师编号T#'	--提示语
			rollback transaction				--回滚
		end
end;
--测试结果:修改失败,显示提示语,并回滚
update course set T# = '66' where cname = '语文'


instead of 触发器

它是前触发型触发器,指定执行触发器的不是执行引发触发器的语句,而是替代引发语句的操作。在表或试图上每个insert、update、delete语句最多可以定义一个instead of触发器。这种触发器用的不多,但作用无法替代。

简称:当你发送增删改命令时,不执行,并且还要执行我的语句操作!


禁止任何添加、删除、修改

alter trigger trig_istd					--修改 触发器 名称
	on course							--on 表名
	instead of insert, delete, update	--instead of 添加 删除 修改
as										--格式
begin
	select * from course				--触发后的操作
end;									--结束

下面只用“添加”来测试,结果失败

--测试结果:添加失败,显示course表内容
insert into course values('66', '测试', '66')


DDL触发器

简称:?

  • 可以在服务器、数据库上创建的触发器
  • all server(所有服务器)限制对数据库的操作
  • all database(所有数据库)限制对表格的操作
  • 不写all表示当前服务器/数据库

禁止修改当前所在数据库的所有表结构

create trigger trig_db			--创建 触发器 名称
	on database					--on 数据库名称
	after drop_table, alter_table				--可以多表
as
begin
	print '不能修改表结构'		--提示语
	rollback transaction		--回滚
end
go
--测试结果:修改表结构失败,回滚,并显示提示语
alter table course add class int

小练习

使用触发器,如果插入course表中的数据,在Teacher表中没有对应的教师编号T#,
则回滚,并显示提示语

素材Teacher表在"SQL学习计划二"

温馨提示:注意留意表的触发器数量,防止创建太多触发器相互干扰!!!哈哈哈!!!

alter trigger trig_test	
	on Course
	after insert
as
begin
	declare @nm varchar(10)						--定义一个变量
	select @nm = inserted.T# from inserted		--存放inserted的cname位置的内容
	if not exists(select T# from Teacher where T# = @nm)
		begin
			print 'Error:在Teacher表未找到对应教师编号T#'	--提示语
			rollback transaction							--回滚
		end
end


一些对存储过程的查询方法

exec sp_help trig_db		--基本信息
exec sp_helptext trig_db	--代码内容
exec sp_depends trig_db		--和触发器相关的数据库对象的信息

删除触发器

drop trigger trig_cou				--删除DML触发器/instead of 触发器
drop trigger trig_db on database	--删除DDL触发器

启用或禁止触发器

触发器创建后便启动,若想暂停,可以禁用

--DML触发器/instead of 触发器
enable trigger trig_cou on course	--启用course表的trig_cou触发器
disable trigger trig_cou on course	--禁用course表的trig_cou触发器

--DDL触发器
enable trigger trig_db on database	    --启用当前数据库的trig_db触发器
disable trigger trig_db on all server	--禁用所有服务器的trig_db触发器
  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-01-16 13:08:20  更:2022-01-16 13:09:07 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 14:34:06-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码