当前位置: 首页 > article >正文

【SQL实验】触发器

下载素材文件”tsgl”、“成绩管理”,将tsgl.bak和成绩管理.bak数据库还原到库中【导入操作在之前的文章中详细讲过】

触发器
1、为图书表设置更新触发器,根据总编号来更新书名、作者、出版社、分类号和单价(根据总编号找到相应记录,然后更新书名、作者等信息),更新完毕后提示“图书表更新成功”;编写测试语句进行测试。

被触发事件就是一个print语句

after (for)触发器“触发事件”和“被 触发事件”都执行

----------创建ts更新触发器2----------
--create trigger ts更新触发器2
--on ts
--after update
--as
--	print '图书表更新成功'


----------测试ts更新触发器----------
--update ts set 书名 = 'ceshi_2'
--where 总编号 = 999999

2、为dz表插入触发器dz_insert,在插入记录后提示“借书证号为XXXX的读者记录已被插入”,其中XXXX为插入的具体字段值;

--use 图书管理

----------创建dz的插入触发器----------
--create trigger dz插入触发器
--on dz
--after insert
--as
--begin
--	declare @x nvarchar(10)
--	select @x = 借书证号
--	from inserted
--	print '借书证号为' + @x + '的读者记录已被插入'
--end

----------dz插入触发器的测试----------
--insert into dz
--values('999','信息系','ceshi','男',1999-07-01,'教授','1号楼424')

 声明变量 @x,用于存储借书证号

从 inserted 表中获取插入记录的 借书证号

   

3、为图书表设置更新触发器,根据总编号来更新书名(根据图书编号找到相应记录,更新书名),更新完毕后提示“更新后的总编号为:XX,书名为:XX”(其中XX代表相应字段的值);

   输入update语句,例如将总编号为J007的图书名改为网络安全基础,测试更新触发器。

----------创建ts更新触发器----------
--create trigger ts更新触发器
--on ts
--after update
--as
--begin
------声明变量
--	declare @x nvarchar(10)		--总编号
--	declare @a nvarchar(10)		--书名
------从inserted表中找出修改的编号
--	select @x = 总编号,@a = 书名 
--	from inserted

------输出结果
--	print '更新后的总编号为:'+@x+',书名为:'+@a
--end

----------测试ts更新触发器----------
--update ts set 书名 = 'ceshi_1'
--where 总编号 = 999999

 变量需要先声明再赋值

赋值 

select语句不能同时完成赋值和查询两种操作

4、为ts设置删除触发器,若删除ts记录,则jy表中的相关书籍的记录也应删除,并提示“ts表和jy表相关记录已一并删除” ;编写测试语句进行测试。

---------创建ts删除触发器----------
--create trigger ts删除触发器
--on ts
--after delete
--as 
--begin
--	declare @x nvarchar(10)
--	select @x = 总编号
--	from deleted
--	delete from jy
--	where 总编号 = @x
--	print 'ts表和jy表相关记录已一并删除'
--end

----------测试ts删除触发器----------
--delete from ts
--where 总编号 = 445501

5、为ts创建instead of 触发器,当删除某条记录时,显示“对不起,不允许删除操作” ;编写测试语句进行测试。

  

----------创建ts禁止删除触发器----------
--create trigger ts禁止删除
--on ts
--instead of delete
--as 
--print '对不起,不允许删除操作'

----------测试ts删除触发器----------
--delete from ts
--where 总编号 = 999999

6、为“成绩管理”数据库中的tscore表设置触发器,限制“数据库”课程选课人数不超过3人,若选满,则提示“对不起,已选满!”

create trigger trigger8
on tScore
after insert
as
    if ((select count(*) from tCourse,tScore where tCourse.课程编号
                  =tScore.课程编号 and 课程名='数据库')>3)
    begin
           delete from tScore where 学号 in (select 学号 from inserted)      
           and 课程编号=(select 课程编号 from tCourse where 课程名=‘
                            数据库')
            print'对不起,已选满!'
    end

完整代码:

--一、触发器

--1、为dz表和ts表设计分别在插入记录后提示“借书证号为XXXX的读者记录已被插入”或“总编号为XXXX的图书记录已被插入”,
--其中XXXX为插入的具体字段值;写一条insert语句,插入记录,对插入触发器进行测试。

--use 图书管理

----------创建dz的插入触发器----------
--create trigger dz插入触发器
--on dz
--after insert
--as
--begin
--	declare @x nvarchar(10)
--	select @x = 借书证号
--	from inserted
--	print '借书证号为' + @x + '的读者记录已被插入'
--end

----------dz插入触发器的测试----------
--insert into dz
--values('999','信息系','ceshi','男',1999-07-01,'教授','1号楼424')

----------创建ts的插入触发器----------
--create trigger ts插入触发器
--on ts
--after insert
--as
--begin
--	declare @x nvarchar(10)
--	select @x = 总编号
--	from inserted
--	print '总编号为' + @x + '的图书记录已被插入'
--end

----------ts插入触发器的测试----------
--insert into ts
--values('999999','ceshi','张三','电子工业出版社','TP',24)





--2、为图书表设置更新触发器,根据图书编号来更新书名、作者、出版社、分类号和单价
--(根据图书编号找到相应记录,然后更新书名、作者等信息),
--更新完毕后提示“更新后的总编号为:XX,书名为:XX”
--(其中XX代表相应字段的值);输入update语句,例如将图书编号为J007的图书名改为网络安全基础,测试更新触发器。

--use 图书管理

----------创建ts更新触发器----------
--create trigger ts更新触发器
--on ts
--after update
--as
--begin
------声明变量
--	declare @x nvarchar(10)		--总编号
--	declare @a nvarchar(10)		--书名
------从inserted表中找出修改的编号
--	select @x = 总编号,@a = 书名 
--	from inserted

------输出结果
--	print '更新后的总编号为:'+@x+',书名为:'+@a
--end

----------测试ts更新触发器----------
--update ts set 书名 = 'ceshi_1'
--where 总编号 = 999999


--3、为图书表设置更新触发器,根据总编号来更新书名、作者、出版社、分类号和单价(根据总编号找到相应记录,
--然后更新书名、作者等信息),更新完毕后提示“图书表更新成功”;编写测试语句进行测试。

----------创建ts更新触发器2----------
--create trigger ts更新触发器2
--on ts
--after update
--as
--	print '图书表更新成功'


----------测试ts更新触发器----------
--update ts set 书名 = 'ceshi_2'
--where 总编号 = 999999




--4、为dz表设置删除触发器,若删除dz记录,则jy表中相关记录也应删除,
--并提示“dz表和jy表相关记录已一并删除” ;编写测试语句进行测试。

----------创建ts删除触发器----------
--create trigger ts删除触发器
--on ts
--after delete
--as 
--begin
--	declare @x nvarchar(10)
--	select @x = 总编号
--	from deleted
--	delete from jy
--	where 总编号 = @x
--	print 'ts表和jy表相关记录已一并删除'
--end

----------测试ts删除触发器----------
--delete from ts
--where 总编号 = 445501

--5、为ts创建instead of 触发器,当删除某条记录时,显示“对不起,不允许删除操作” ;编写测试语句进行测试。

----------创建ts禁止删除触发器----------
--create trigger ts禁止删除
--on ts
--instead of delete
--as 
--print '对不起,不允许删除操作'

----------测试ts删除触发器----------
--delete from ts
--where 总编号 = 999999




--6、使用查看命令查看dz表中已创建的触发器;使用命令查看某各触发器代码。

--sp_helptrigger @tabname = ts
--sp_helptext ts插入触发器




--7、修改某触发器的名称。

--sp_rename ts删除触发器, ts删除



--8、方法一、替换触发器
--create trigger 触发器1 on tScore
--instead of insert
--as 
--begin
--  declare @sum nvarchar(50)
--  select @sum=COUNT(课程编号) from tScore 
--  where 课程编号=(select 课程编号 from tCourse    where 课程名='数据库')
--  if @sum>3
--      print '对不起,已选满'
--  else
--      insert into tScore select * from inserted
--end
--方法二:后触发器
--create trigger trigger8
--on tScore
--after insert
--as
--    if ((select count(*) from tCourse,tScore where tCourse.课程编号
--                  =tScore.课程编号 and 课程名='数据库')>3)
--    begin
--           delete from tScore where 学号 in (select 学号 from inserted)      
--           and 课程编号=(select 课程编号 from tCourse where 课程名=‘
--                            数据库')
--            print'对不起,已选满!'
--    end





http://www.kler.cn/a/559634.html

相关文章:

  • 说一下HashMap的底层原理
  • ZLMediakit开源视频服务器——配置到本地服务器
  • 简识Kafka集群与RocketMQ集群的核心区别
  • Vue3大文件分片上传,断点续传TS语法(核心思路)
  • PyTorch 深度学习框架中 torch.cuda.empty_cache() 的妙用与注意事项
  • 阿里云SLB负载均衡的ALB和NLB有啥区别?一个是7层一个是4层
  • C++ 设计模式-策略模式
  • Docker基于Ollama本地部署大语言模型
  • 使用大语言模型(Deepseek)构建一个基于 SQL 数据的问答系统
  • Django+Vue3全栈开发实战:从零搭建博客系统
  • 为什么Redis不支持回滚?
  • 自签SSL实现https
  • PHP房屋出租出售高效预约系统小程序源码
  • Linux:互斥
  • 硬核技术组合!用 DeepSeek R1、Ollama、Docker、RAGFlow 打造专属本地知识库
  • `AdminAdminDTO` 和 `userSession` 对象中的字段对应起来的表格
  • Linux 磁盘管理命令:LVM命令列表
  • 一、初始爬虫
  • 蓝桥杯试题:区间次方和(前缀和)
  • Linux运维_Dockerfile_打包Moby-26.1.4编译dockerd环境