SQL Server触发器的基本语法与作用

本文涉及的产品
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
云数据库 RDS SQL Server,独享型 2核4GB
简介: 原文 http://www.cnblogs.com/xiongzhuang/archive/2013/05/13/3076943.html 什么是触发器? 触发器是在对表进行插入、更新或删除操作时自动执行的存储过程 触发器通常用于强制业务规则 触发器是一种高级约束,可以定义比用CHECK 约束更为复杂的约束 :可执行复杂的SQL语句(if/while/case)、可引用其它表中的列 触发器定义在特定的表上,与表相关。

原文 http://www.cnblogs.com/xiongzhuang/archive/2013/05/13/3076943.html

什么是触发器?

  • 触发器是在对表进行插入、更新或删除操作时自动执行的存储过程
  • 触发器通常用于强制业务规则
  • 触发器是一种高级约束,可以定义比用CHECK 约束更为复杂的约束 :可执行复杂的SQL语句(if/while/case)、可引用其它表中的列
  • 触发器定义在特定的表上,与表相关。
  •  自动触发执行
  •  不能直接调用
  •  是一个事务(可回滚)

使用触发器的好处

触发器可通过数据库中的相关表实现级联更改,不过,通过级联引用完整性约束可以更有效地执行这些更改。

触发器可以强制比用CHECK约束定义的约束更为复杂的约束。与 CHECK 约束不同,触发器可以引用

其它表中的列。例如,触发器可以使用另一个表中的 SELECT 比较插入或更新的数据,以及执行其它操作,

如修改数据或显示用户定义错误信息。触发器也可以评估数据修改前后的表状态,并根据其差异采取对策。

一个表中的多个同类触发器(INSERT、UPDATE 或 DELETE)允许采取多个不同的对策以响应同一个修改语句。

触发器的类型

  • DELETE 触发器
  • INSERT 触发器
  • UPDATE 触发器

创建触发的语法

 

 
CREATE TRIGGER trigger_name
 ON table_name
 [WITH ENCRYPTION]
  FOR [DELETE, INSERT, UPDATE]
 AS 
  T-SQL语句
GO
 

注意:WITH ENCRYPTION表示加密触发器定义的SQL文本 DELETE, INSERT, UPDATE指定触发器的类型

insert 触发器示例

 
/*创建insert触发器,在上网记录表recordInfo上创建插入触发器*/
create trigger tr_insert_recordInfo
on recordInfo
for insert
 as
/*定义变量,用于临时存储插入的会员号、电脑编号和卡的编号*/
declare @cardId char(10)
declare @PCId int
declare @CardNumber char(10)
/*从inserted临时表中获取插入的记录行的信息,包括电脑的编号、卡的编号*/
select @PCId=PCId,@cardId=CardId from inserted
/*根据电脑编号修改电脑的使用状态*/
update PCInfo set PCUse=1 where PCId=@PCId
/*根据卡的编号查询会员号*/
select @CardNumber=CardNumber from cardinfo where CardId=@cardid
/*显示上机成功的信息*/
print '上机成功!会员号是:'+@CardNumber+'机器号是:'+convert(char(10),@PCId)
go
----插入测试数据,会员号为的上机
set nocount on      --不显示sql语句影响的记录行数
declare @CardId int   ---声明一个存储卡的编号的变量
---根据会员号查处卡的编号
select @cardId=cardid from cardinfo where cardNumber='c001'  
---向recordInfo表中插入一条记录信息,卡的编号、电脑编号和上机时间
 insert into recordInfo(cardId,PCId,beginTime) values(@cardId,1,getDate())
----查看结果
select * from recordInfo
select * from PCInfo
 

update触发器示例

 
---创建delete触发器,在上网记录表RecordInfo上创建删除触发器
create  trigger tr_delete_recordInfo
on recordInfo
for delete
as

if exists(select * from sysobjects where name='backRecordInfo')
  ----如果backrecordInfo表存在,就添加记录即可
  insert into backRecordInfo select * from deleted
else
  ----创建backRecordInfo表,从deleted中获取被删除的数据
  select * into backRecordInfo from deleted
print'backRecordInfo表备份数据成功,备份表中的数据为:'
   select * from backRecordInfo
go
-------关键代码------
----测试delete触发器,删除数据
set nocount on
delete from recordInfo
---查看结果
print'记录表中的数据为:'
select * from recordInfo
 

elete触发器示例

 
-------关键代码------
create trigger tr_update_recordInfo
on recordInfo
for update
as
declare @beforePCId int
declare @afterPCId int
select @beforePCId =PCId from deleted
select @afterPCId=PCID from inserted
---根据电脑编号修改使用状态-----
---根据以前使用的电脑编号把电脑的使用状态改为:
 update PCInfo set PCUse=0 where PCId=@beforePCId
---根据现在使用的电脑编号把电脑的使用状态改为:
 update PCInfo set PCUse=1 where PCId=@afterPCId
----显示电脑换机成功
print'换机成功!从'+convert(varchar(10),@beforePCId)+'号电脑换到'+convert(varchar(10),@afterPCId)+'号电脑'
go
/*测试update触发器,修改电脑编号*/
--显示更改前,记录表中的数据
print'更改前,记录表中的数据'
select * from recordInfo

--显示更改前,电脑表中的数据
print'更改前,电脑表中的数据'
select * from PCInfo

set nocount on
---把电脑号为1的改为2
update recordInfo set PCId=2 where PCId=1  
---查看结果
print'更改后,记录表中的数据'
select * from recordInfo
print'更改后,电脑表中的数据'
select * from PCInfo
 

instead of触发器的使用

instead of触发器的使用范围,instead of 触发器可以同时在数据表和视图中使用。通常在以下几种情况下,建议使用instead of触发器:
数据库里的数据禁止修改:例如电信部门的通话记录是不能修改的,一旦修改,则通话费用的计数将不准确。
有可能要回滚修改的SQL语句
在视图中使用触发器
用自己的方式去修改数据

instead of触发器示例

 
---创建update触发器,在上网记录表recordInfo上创建修改(列)触发器
create trigger tr_updateColum1_recordInfo
on recordInfo
instead of insert
as
 declare @cardbalance int  --声明用于存储用户余额的变量
 declare @CardId int       --声明用于存储用户卡的编号的变量
 declare @PCId int         --声明用于存储电脑编号的变量
---inserted临时表中获取插入的记录行信息,包括电脑编号、卡的编号
select @cardId=cardId,@PCId=PCId from inserted
select @cardbalance=cardBalance from cardInfo where CardId=@CardId
print'您的余额为:'+convert(varchar(10),@cardBalance) ---打印余额信息
if(@cardBalance<2)    ---判断余额多少,看能否正常上机
print'余额小于元,不能上机。请尽快充值!'
else
----根据电脑的编号修改电脑的使用状态更改为正在使用
  update PCInfo set PCUse=1 where PCId=@PCId
----向recordInfo表插入上机记录
insert into recordInfo(cardId,PCId,beginTime)values(@CardId,@PCId,getdate())
 print'上机成功'
-------关键代码------
set nocount on
declare @cardId int  ---声明一个存储卡的编号的变量
---根据会员号查出卡的编号
select @cardId=cardId from cardInfo where cardNumber='c001'
----向recordInfo表中插入一条记录信息,卡的编号、电脑的编号和上机时间
insert into recordInfo(cardId,PCId,beginTime)values(@cardId,1,getdate())
select * from recordInfo
select * from PCInfo
 
相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS&nbsp;SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/sqlserver
目录
相关文章
|
1月前
|
SQL 关系型数据库 MySQL
MySQL数据库基础第一篇(SQL通用语法与分类)
MySQL数据库基础第一篇(SQL通用语法与分类)
|
28天前
|
SQL PHP
thinkphp之进阶sql语法,持续更新
thinkphp之进阶sql语法,持续更新
17 0
|
1天前
|
SQL 存储 监控
SQL Server的并行实施如何优化?
【7月更文挑战第23天】SQL Server的并行实施如何优化?
19 13
|
5天前
|
存储 SQL C++
对比 SQL Server中的VARCHAR(max) 与VARCHAR(n) 数据类型
【7月更文挑战7天】SQL Server 中的 VARCHAR(max) vs VARCHAR(n): - VARCHAR(n) 存储最多 n 个字符(1-8000),适合短文本。 - VARCHAR(max) 可存储约 21 亿个字符,适合大量文本。 - VARCHAR(n) 在处理小数据时性能更好,空间固定。 - VARCHAR(max) 对于大文本更合适,但可能影响性能。 - 选择取决于数据长度预期和业务需求。
|
9天前
|
SQL Oracle 关系型数据库
MySQL、SQL Server和Oracle数据库安装部署教程
数据库的安装部署教程因不同的数据库管理系统(DBMS)而异,以下将以MySQL、SQL Server和Oracle为例,分别概述其安装部署的基本步骤。请注意,由于软件版本和操作系统的不同,具体步骤可能会有所变化。
40 3
|
14天前
|
SQL Java 数据库连接
mybatis动态SQL常用语法总结
MyBatis 使用 OGNL 表达式语言处理动态SQL,如 `if` 标签进行条件判断,`choose`、`when`、`otherwise` 实现多条件选择,`where`、`set` 管理SQL关键字,`trim` 提供通用修剪功能,`foreach` 遍历集合数据。`sql` 和 `include` 用于代码重用,`selectKey` 处理插入后的返回值。参数传递支持匿名、具名、列表、Map、Java Bean和JSON方式。注意SQL转义及使用合适的jdbcType映射Java类型。
34 7
|
15天前
|
SQL 存储 安全
数据库数据恢复—SQL Server数据库出现逻辑错误的数据恢复案例
SQL Server数据库数据恢复环境: 某品牌服务器存储中有两组raid5磁盘阵列。操作系统层面跑着SQL Server数据库,SQL Server数据库存放在D盘分区中。 SQL Server数据库故障: 存放SQL Server数据库的D盘分区容量不足,管理员在E盘中生成了一个.ndf的文件并且将数据库路径指向E盘继续使用。数据库继续运行一段时间后出现故障并报错,连接失效,SqlServer数据库无法附加查询。管理员多次尝试恢复数据库数据但是没有成功。
|
20天前
|
SQL 数据库 索引
SQL SELECT语句的语法与查询优化技巧
SQL SELECT语句的语法与查询优化技巧
|
21天前
|
SQL 存储 关系型数据库
关系型数据库SQL Server学习
【7月更文挑战第4天】
26 2
|
25天前
|
SQL 存储 测试技术