JavaEE进阶 SQL Server 触发器
安彩凤 2018-04-04 来源 : 阅读 1537 评论 0

摘要:触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程。触发器主要是通过事件进行触发被自动调用执行的。而存储过程可以通过存储过程的名称被调用。本篇JavaEE进阶教程将为大家讲解JavaEE进阶编程的知识点,看完这篇文章会让你对JavaEE进阶编程的知识点有更加清晰的理解和运用。

SQL Server 触发器

触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程。触发器主要是通过事件进行触发被自动调用执行的。而存储过程可以通过存储过程的名称被调用。本篇JavaEE进阶教程将为大家讲解JavaEE进阶编程的知识点,看完这篇文章会让你对JavaEE进阶编程的知识点有更加清晰的理解和运用。


DML触发器分为:

    1、 after触发器(之后触发)

        a、 insert触发器

        b、 update触发器

        c、 delete触发器

    2、 instead of 触发器 (之前触发)

触发器有两个特殊的表:插入表(instered表)和删除表(deleted表)。这两张是逻辑表也是虚表。由系统在内存中创建者两张表,不会存储在数据库中。而且两张表的都是只读的,只能读取数据而不能修改数据。这两张表的结果总是与被改触发器应用的表的结构相同。当触发器完成工作后,这两张表就会被删除。Inserted表的数据是插入或是修改后的数据,而deleted表的数据是更新前的或是删除的数据。

 创建触发器

    语法

创建触发器

语法

create trigger tgr_name
 on table_name
 with encrypion –加密触发器
 for update…
 as
 Transact-SQL

# 创建insert类型触发器

–创建insert插入类型触发器

if (object_id(‘tgr_classes_insert’, ‘tr’) is not null)
 drop trigger tgr_classes_insert
 go
 create trigger tgr_classes_insert
 on classes
 for insert –插入触发
 as


–定义变量

declare @id int, @name varchar(20), @temp int;
 –在inserted表中查询已经插入记录信息
 select @id = id, @name = name from inserted;
 set @name = @name + convert(varchar, @id);
 set @temp = @id / 2; 
 insert into student values(@name, 18 + @id, @temp, @id);
 print ‘添加学生成功!’;
 go


–插入数据

insert into classes values(‘5班’, getDate());

–查询数据

select * from classes;
 select * from student order by id;


insert触发器,会在inserted表中添加一条刚插入的记录。

 

# 创建delete类型触发器

–delete删除类型触发器

if (object_id(‘tgr_classes_delete’, ‘TR’) is not null)
 drop trigger tgr_classes_delete
 go
 create trigger tgr_classes_delete
 on classes
 for delete –删除触发
 as
 print ‘备份数据中……’; 
 if (object_id(‘classesBackup’, ‘U’) is not null)
 –存在classesBackup,直接插入数据
 insert into classesBackup select name, createDate from deleted;
 else
 –不存在classesBackup创建再插入
 select * into classesBackup from deleted;
 print ‘备份数据成功!’;
 go


–不显示影响行数

–set nocount on;
 delete classes where name = ‘5班’;


–查询数据

select * from classes;
 select * from classesBackup;


delete触发器会在删除数据的时候,将刚才删除的数据保存在deleted表中。

 

# 创建update类型触发器

–update更新类型触发器

if (object_id(‘tgr_classes_update’, ‘TR’) is not null)
 drop trigger tgr_classes_update
 go
 create trigger tgr_classes_update
 on classes
 for update
 as
 declare @oldName varchar(20), @newName varchar(20);


–更新前的数据

select @oldName = name from deleted;
 if (exists (select * from student where name like ‘%’+ @oldName + ‘%’))
 begin


–更新后的数据

select @newName = name from inserted;
 update student set name = replace(name, @oldName, @newName) where name like ‘%’+ @oldName + ‘%’;
 print ‘级联修改数据成功!’;
 end
 else
 print ‘无需修改student表!’;
 go


–查询数据

select * from student order by id;
 select * from classes;
 update classes set name = ‘五班’ where name = ‘5班’;


update触发器会在更新数据后,将更新前的数据保存在deleted表中,更新后的数据保存在inserted表中。

 

# update更新列级触发器

if (object_id(‘tgr_classes_update_column’, ‘TR’) is not null)
 drop trigger tgr_classes_update_column
 go
 create trigger tgr_classes_update_column
 on classes
 for update
 as


–列级触发器:是否更新了班级创建时间

if (update(createDate))
 begin
 raisError(‘系统提示:班级创建时间不能修改!’, 16, 11);
 rollback tran;
 end
 go


–测试

select * from student order by id;
 select * from classes;
 update classes set createDate = getDate() where id = 3;
 update classes set name = ‘四班’ where id = 7;


更新列级触发器可以用update是否判断更新列记录;

 

# instead of类型触发器

instead of触发器表示并不执行其定义的操作(insert、update、delete)而仅是执行触发器本身的内容。

创建语法

create trigger tgr_name
 on table_name
 with encryption
 instead of update…
 as
 T-SQL

# 创建instead of触发器

if (object_id(‘tgr_classes_inteadOf’, ‘TR’) is not null)
 drop trigger tgr_classes_inteadOf
 go
 create trigger tgr_classes_inteadOf
 on classes
 instead of delete/*, update, insert*/
 as
 declare @id int, @name varchar(20);


–查询被删除的信息,并赋值

select @id = id, @name = name from deleted;
 print ‘id: ’ + convert(varchar, @id) + ‘, name: ’ + @name;


–先删除student的信息

delete student where cid = @id;

–再删除classes的信息

delete classes where id = @id;
 print ‘删除[ id: ’ + convert(varchar, @id) + ‘, name: ’ + @name + ’ ] 的信息成功!’;
 go
 –test
 select * from student order by id;
 select * from classes;
 delete classes where id = 7;

# 显示自定义消息raiserror

if (object_id(‘tgr_message’, ‘TR’) is not null)
 drop trigger tgr_message
 go
 create trigger tgr_message
 on student
 after insert, update
 as raisError(‘tgr_message触发器被触发’, 16, 10);
 go
 –test
 insert into student values(‘lily’, 22, 1, 7);
 update student set sex = 0 where name = ‘lucy’;
 select * from student order by id;

# 修改触发器

 alter trigger tgr_message
 on student
 after delete
 as raisError(‘tgr_message触发器被触发’, 16, 10);
 go
 –test
 delete from student where name = ‘lucy’;

# 启用、禁用触发器

–禁用触发器

disable trigger tgr_message on student;

–启用触发器

enable trigger tgr_message on student;

# 查询创建的触发器信息

–查询已存在的触发器

select * from sys.triggers;
select * from sys.objects where type = ‘TR’;

–查看触发器触发事件

 select te.* from sys.trigger_events te join sys.triggers t
 on t.object_id = te.object_id
 where t.parent_class = 0 and t.name = ‘tgr_valid_data’;

–查看创建触发器语句

exec sp_helptext ‘tgr_message’;

# 示例,验证插入数据

if ((object_id(‘tgr_valid_data’, ‘TR’) is not null))
 drop trigger tgr_valid_data
 go
 create trigger tgr_valid_data
 on student
 after insert
 as
 declare @age int,
 @name varchar(20);
 select @name = s.name, @age = s.age from inserted s;
 if (@age < 18)
 begin
 raisError(‘插入新数据的age有问题’, 16, 1);
 rollback tran;
 end
 go
 –test
 insert into student values(‘forest’, 2, 0, 7);
 insert into student values(‘forest’, 22, 0, 7);
 select * from student order by id;

# 示例,操作日志

if (object_id(‘log’, ‘U’) is not null)
 drop table log
 go
 create table log(
 id int identity(1, 1) primary key,
 action varchar(20),
 createDate datetime default getDate()
 )
 go
 if (exists (select * from sys.objects where name = ‘tgr_student_log’))
 drop trigger tgr_student_log
 go
 create trigger tgr_student_log
 on student
 after insert, update, delete
 as
 if ((exists (select 1 from inserted)) and (exists (select 1 from deleted)))
 begin
 insert into log(action) values(‘updated’);
 end
 else if (exists (select 1 from inserted) and not exists (select 1 from deleted))
 begin
 insert into log(action) values(‘inserted’);
 end
 else if (not exists (select 1 from inserted) and exists (select 1 from deleted))
 begin
 insert into log(action) values(‘deleted’);
 end
 go
 –test
 insert into student values(‘king’, 22, 1, 7);
 update student set sex = 0 where name = ‘king’;
 delete student where name = ‘king’;
 select * from log;
 select * from student order by id;


以上内容由职坐标整理并发布,欢迎大家前来职坐标学习!

本文由 @职坐标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论
本文作者 联系TA

擅长组织调研,人长盘点

  • 13
    文章
  • 4948
    人气
  • 83%
    受欢迎度

已有12人表明态度,83%喜欢该老师!

进入TA的空间
求职秘籍 直通车
  • 索取资料 索取资料 索取资料
  • 答疑解惑 答疑解惑 答疑解惑
  • 技术交流 技术交流 技术交流
  • 职业测评 职业测评 职业测评
  • 面试技巧 面试技巧 面试技巧
  • 高薪秘笈 高薪秘笈 高薪秘笈
TA的其他文章 更多>>
Web前端基础 正则表达式大全
经验技巧 0% 的用户喜欢
JavaEE进阶 基于Servlet3.0的文件上传
经验技巧 0% 的用户喜欢
JavaEE进阶 关于ORACLE数据库的导入导出
经验技巧 0% 的用户喜欢
JavaEE进阶 WebService的相关概念
经验技巧 0% 的用户喜欢
JavaEE进阶 Web Service概念
经验技巧 0% 的用户喜欢
其他海同师资 更多>>
吕益平
吕益平 联系TA
熟悉企业软件开发的产品设计及开发
孔庆琦
孔庆琦 联系TA
对MVC模式和三层架构有深入的研究
周鸣君
周鸣君 联系TA
擅长Hadoop/Spark大数据技术
范佺菁
范佺菁 联系TA
擅长Java语言,只有合理的安排和管理时间你才能做得更多,行得更远!
金延鑫
金延鑫 联系TA
擅长与学生或家长及时有效沟通
经验技巧30天热搜词 更多>>

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程