/*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 /*创建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='c'
---向recordInfo表中插入一条记录信息,卡的编号、电脑编号和上机时间
insert into recordInfo(cardId,PCId,beginTime) values(@cardId,,getDate())
----查看结果
select * from recordInfo
select * from PCInfo
go ---创建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
go ----update触发器示例
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
---把电脑号为的改为
update recordInfo set PCId= where PCId=
---查看结果
print'更改后,记录表中的数据'
select * from recordInfo
print'更改后,电脑表中的数据'
select * from PCInfo --instead of 触发器可以同时在数据表和视图中使用。通常在以下几种情况下,建议使用instead of触发器:
--1、数据库里的数据禁止修改:例如电信部门的通话记录是不能修改的,一旦修改,则通话费用的计数将不准确。
--2、有可能要回滚修改的SQL语句
--3、在视图中使用触发器
--4、用自己的方式去修改数据
----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'上机成功'
go
-------关键代码------
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
go

SQLSever 触发器的更多相关文章

  1. SQLSEVER 不同服务器下两个结构相似的表实现数据同步(触发器)

    1.建立链接服务器 在ServerA 中创建指向ServerB的链接服务器,并做好账号映射.addlinkedserver存储过程创建一个链接服务器,参数详情参见官方文档. 第1个参数LNK_Serv ...

  2. SQLSEVER 同台服务器下不同表 触发器实现数据实时同步

    触发器的使用: 1.首先建立两个相同结构的表,两个表明的列的名称不同. student_01   字段  name  ;  字段 age  ; 字段  class ; student_02   字段  ...

  3. SQLSEVER在存储过程或触发器中模糊查询拼接

    declare @name nvarchar(50); declare @name_pin nvarchar(50); set @name_pin = '%'+@name +'%' 模糊查询: sel ...

  4. SqlSever数据库实践周

    资源下载 进行了为期5天的数据库设计,虽然以前用过数据库,但是这一次是使用书上规范的设计流程设计的数据库,感觉有必要记录一下,希望对其他人有帮助. 我的收获:在这个博客中会体现到我的收获,对于将要进行 ...

  5. MySQL中的存储过程、函数与触发器

    一.对待存储过程和函数的态度 优点: 1.存储过程只在创建时进行编译,sql语句则每次执行都需要编译.能提高数据库执行速度. 2.简单复杂操作结合事物一起封装. 3.复用性高. 4.安全性高,可指定存 ...

  6. pt-online-schema-change中update触发器的bug

    pt-online-schema-change在对表进行表结构变更时,会创建三个触发器. 如下文测试案例中的t2表,表结构如下: mysql> show create table t2\G . ...

  7. MySQL主从环境下存储过程,函数,触发器,事件的复制情况

    下面,主要是验证在MySQL主从复制环境下,存储过程,函数,触发器,事件的复制情况,这些确实会让人混淆. 首先,创建一张测试表 mysql),age int); Query OK, rows affe ...

  8. MySQL 系列(三)你不知道的 视图、触发器、存储过程、函数、事务、索引、语句

    第一篇:MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决 第二篇:MySQL 系列(二) 你不知道的数据库操作 第三篇:MySQL 系列(三)你不知道的 视图.触发器.存储过程.函数 ...

  9. MSSQL 事务,视图,索引,存储过程,触发器

    事务 事务是一种机制.是一种操作序列,它包含了一组数据库操作命令,这组命令要么全部执行,要么全部不执行. 在数据库系统上执行并发操作时事务是作为最小的控制单元来使用的.这特别适用于多用户同时操作的数据 ...

随机推荐

  1. foreachRDD,foreach,foreachPartition区别联系

    foreachRDD(SparkStreaming): SparkStreaming是流式实时处理数据,就是将数据流按照定义的时间进行分割(就是"批处理").每一个时间段内处理到的 ...

  2. 图解HTTP总结(7)——确保Web安全的HTTPS

    HTTP 主要有这些不足, 例举如下.       通信使用明文( 不加密) , 内容可能会被窃听.       不验证通信方的身份, 因此有可能遭遇伪装. 无法证明报文的完整性, 所以有可能已遭篡改 ...

  3. C++基础 静态成员

    静态成员是类的所有 对象共有的变量,在编译 阶段就必须分配空间. 需要注意: (1)静态成员变量的定义和使用 class Test{ static int a; }; ; void main() {} ...

  4. Linux两种方式rd.break和init重置root管理员密码

    centos7/rhel7进入单用户方式和重置密码方式发生了较大变化,GRUB由b引导变成了ctrl+x引导. 重置密码主要有rd.break和init两种方法. rd.break方法: 1.启动的时 ...

  5. tar命令,vi编辑器

    一.将用户信息数据库文件和组信息数据库文件纵向合并为一个文件/1.txt(覆盖): [root@localhost /]# cat /etc/passwd /etc/group > 1.txt ...

  6. Git-补丁文件交互

    版本库间的交互是通过git push和/或git pull命令实现的,这是Git最主要的交互模式,但并不是全部.使用补丁文件是另外一种交互方式,适用于参与者众多的大型项目进行分布式开发. 创建补丁 G ...

  7. Keil如何生成bin文件【Keil生成Bin文件的方法】

    使用过Keil的同鞋都知道,现在Keil中默认可以输出.axf的调试文件和可以通过钩选输出的.hex可执行文件,没有bin(二进制)文件的输出选项.可是偏偏某些时候需要或者习惯性的使用.bin文件来进 ...

  8. ionic3中关于Ionic ui component使用的一些总结

    在我的理解中,IONIC中例如 ion-list ion-item  ion-input 其实就是相于一段自定义的指令 ,相对于angular1.x中的东西, 所以,我们在使用中,要特别去注意butt ...

  9. hash算法和常见的hash函数 [转]

       Hash,就是把任意长度的输入,通过散列算法,变换成固定长度的输出,该输出就是散列值. 这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能 会散列成相同的输出,而不 ...

  10. javascript类式继承模式#3——借用和设置原型

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...