sqlserver触发器编写(SQLSever中的触发器基本语法与作用)
sqlserver触发器编写
SQLSever中的触发器基本语法与作用什么是触发器?
触发器是在对表进行插入、更新或删除操作时自动执行的存储过程。 触发器对表进行插入、更新、删除的时候会自动执行的特殊存储过程。触发器一般用在check约束更加复杂的约束上面。触发器和普通的存储过程的区别是:触发器是当对某一个表进行操作。诸如:update、insert、delete这些操作的时候,系统会自动调用执行该表上对应的触发器。SQL Server 2005中触发器可以分为两类:DML触发器和DDL触发器,其中DDL触发器它们会影响多种数据定义语言语句而激发,这些语句有create、alter、drop语句。
SQL Server为每个触发器都创建了两个专用表﹕Inserted表和Deleted表。
触发器通常用于强制业务规则
触发器是一种高级约束,可以定义比用CHECK 约束更为复杂的约束 :可执行复杂的SQL语句(if/while/case)、可引用其它
表中的列
触发器定义在特定的表上,与表相关。
自动触发执行
不能直接调用
是一个事务(可回滚)使用触发器的好处触发器可通过数据库中的相关表实现级联更改,不过,通过级联引用完整性约束可以更有效地执行这些更改。触发器可以强制比用CHECK约束定义的约束更为复杂的约束。与 CHECK 约束不同,触发器可以引用其它表中的列。例如,触发器可以使用另一个表中的 SELECT 比较插入或更新的数据,以及执行其它操作,如修改数据或显示用户定义错误信息。触发器也可以评估数据修改前后的表状态,并根据其差异采取对策。一个表中的多个同类触发器(INSERT、UPDATE 或 DELETE)允许采取多个不同的对策以响应同一个修改语句。
DML触发器分为:
1、 after触发器(之后触发)
a、 insert触发器
b、 update触发器
c、 delete触发器
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() declare @PCId int declare @CardNumber char() /*从inserted临时表中获取插入的记录行的信息,包括电脑的编号、卡的编号*/ select @PCId=PCId,@cardId=CardId from inserted /*根据电脑编号修改电脑的使用状态*/ update PCInfo set PCUse= where PCId=@PCId /*根据卡的编号查询会员号*/ select @CardNumber=CardNumber from cardinfo where CardId=@cardid /*显示上机成功的信息*/ print '上机成功!会员号是:'+@CardNumber+'机器号是:'+convert(char(),@PCId) go ----插入测试数据,会员号为的上机 set nocount on --不显示sql语句影响的记录行数 declare @CardId int ---声明一个存储卡的编号的变量 ---根据会员号查处卡的编号 select @cardId=cardid from cardinfo where cardNumber='c' ---向recordInfo表中插入一条记录信息,卡的编号、电脑编号和上机时间 insert into recordInfo(cardId,PCId,beginTime) values(@cardId,,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
delete触发器示例
-------关键代码------ 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= where PCId=@beforePCId ---根据现在使用的电脑编号把电脑的使用状态改为: update PCInfo set PCUse= where PCId=@afterPCId ----显示电脑换机成功 print'换机成功!从'+convert(varchar(),@beforePCId)+'号电脑换到'+convert(varchar(),@afterPCId)+'号电脑' go /*测试update触发器,修改电脑编号*/ --显示更改前,记录表中的数据 print'更改前,记录表中的数据' select * from recordInfo --显示更改前,电脑表中的数据 print'更改前,电脑表中的数据' select * from PCInfo set nocount on ---把电脑号为的改为 update recordInfo set PCId= where PCId= ---查看结果 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
以上所述是小编给大家介绍的SQLSever中的触发器基本语法与作用的相关内容,希望对大家有所帮助!
- 用mysql编写test数据库(MySQL制作具有千万条测试数据的测试库的方法)
- mysql字段和关键字(mySQL之关键字的执行优先级讲解)
- mysql数据库简单优化(MySQL数据类型优化原则)
- mysql数据结构讲解(详解MySQL 数据库隔离级别与MVCC)
- mysql的存储性能优化(MySQL的查询缓存和Buffer Pool)
- 如何看idea连接mysql数据库(IDEA 链接Mysql数据库并执行查询操作的完整代码)
- sql server建表语句带字段说明(SqlServer给表增加多个字段的语法)
- sql版本号处理并发(SQL server高并发生成唯一订单号的方法实现)
- sqlserver怎么调成混合登录(如何快速删掉SQL Server登录时登录名下拉列表框中的选项)
- mysql行级锁使用教程(浅析MySQL的lru链表)
- sql行转列的应用(SQL查询语句行转列横向显示实例解析)
- mysql主从复制如何实现(MySql主从复制实现原理及配置)
- mysql与oracle体系结构(详解MySQL实时同步到Oracle解决方案)
- python导出数据到mysql(python定时按日期备份MySQL数据并压缩)
- sql数据库安装概要(详解将DataGrip连接到MS SQL Server的方法)
- php7用什么替代mysql(mysqli扩展无法在PHP7下升级问题的解决)
- 人从众 火炎焱 全椒再现 正月十六走太平 的魅力(人从众火炎焱全椒再现)
- 官宣 全椒籍明星许海峰 奚秀兰 方芳 王璐瑶携手回家 走太平(全椒籍明星许海峰)
- 以前全椒人是怎么过冬的 满满都是回忆(以前全椒人是怎么过冬的)
- NVIDIA显卡份额冲上88 A饭发愁 游戏优化恐没A卡份了(NVIDIA显卡份额冲上88A饭发愁)
- AMD YES A卡还是N卡 A卡和N卡的区别(AMDYESA卡还是N卡)
- 以后显卡多了一个新选择,N卡和A卡外又多了个I卡(以后显卡多了一个新选择)
热门推荐
- linux查看磁盘空间异常占用(Linux磁盘空间释放问题整理)
- 详解从vue的组件传值着手观察者模式(详解从vue的组件传值着手观察者模式)
- 服务器的维护与管理(浅谈网站服务器的维护管理)
- angular 常用模块(详解Angular之路由基础)
- python 获取ip mac 地址(Python3获取电脑IP、主机名、Mac地址的方法示例)
- docker的启动的绝对命令(在docker中开启sshd操作)
- 怎么用docker部署springboot项目(Spring Boot使用Docker分层打包的设置方法)
- 宝塔面板进不去(宝塔面板打不开重启也不行的处理方法)
- vue动态生成的下拉框如何获取值(Vue 级联下拉框的设计与实现)
- vue怎么注册公共组件(解读Vue组件注册方式)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9