zoukankan      html  css  js  c++  java
  • SQLSever 触发器

      1 /*DML触发器分为: 
      2 
      3 1、 after触发器(之后触发)
      4 
      5 a、 insert触发器
      6 
      7 b、 update触发器
      8 
      9 c、 delete触发器*/
     10 
     11 /*UPDATE 触发器创建触发的语法*/
     12 CREATE TRIGGER trigger_name
     13 ON table_name
     14 [WITH ENCRYPTION]
     15 FOR [DELETE, INSERT, UPDATE]
     16 AS
     17 --T-SQL语句
     18 GO
     19 
     20 /*创建insert触发器,在上网记录表recordInfo上创建插入触发器*/
     21 create trigger tr_insert_recordInfo
     22 on recordInfo
     23 for insert
     24 as
     25 /*定义变量,用于临时存储插入的会员号、电脑编号和卡的编号*/
     26 declare @cardId char(10)
     27 declare @PCId int
     28 declare @CardNumber char(10)
     29 /*从inserted临时表中获取插入的记录行的信息,包括电脑的编号、卡的编号*/
     30 select @PCId=PCId,@cardId=CardId from inserted
     31 /*根据电脑编号修改电脑的使用状态*/
     32 update PCInfo set PCUse=1 where PCId=@PCId
     33 /*根据卡的编号查询会员号*/
     34 select @CardNumber=CardNumber from cardinfo where CardId=@cardid
     35 /*显示上机成功的信息*/
     36 print '上机成功!会员号是:'+@CardNumber+'机器号是:'+convert(char(10),@PCId)
     37 go
     38 ----插入测试数据,会员号为的上机
     39 set nocount on --不显示sql语句影响的记录行数
     40 declare @CardId int ---声明一个存储卡的编号的变量
     41 ---根据会员号查处卡的编号
     42 select @cardId=cardid from cardinfo where cardNumber='c' 
     43 ---向recordInfo表中插入一条记录信息,卡的编号、电脑编号和上机时间
     44 insert into recordInfo(cardId,PCId,beginTime) values(@cardId,,getDate())
     45 ----查看结果
     46 select * from recordInfo
     47 select * from PCInfo
     48 go
     49 
     50 ---创建delete触发器,在上网记录表RecordInfo上创建删除触发器
     51 create trigger tr_delete_recordInfo
     52 on recordInfo
     53 for delete
     54 as
     55 if exists(select * from sysobjects where name='backRecordInfo')
     56 ----如果backrecordInfo表存在,就添加记录即可
     57 insert into backRecordInfo select * from deleted
     58 else
     59 ----创建backRecordInfo表,从deleted中获取被删除的数据
     60 select * into backRecordInfo from deleted
     61 print'backRecordInfo表备份数据成功,备份表中的数据为:'
     62 select * from backRecordInfo
     63 go
     64 ----测试delete触发器,删除数据
     65 set nocount on
     66 delete from recordInfo
     67 ---查看结果
     68 print'记录表中的数据为:'
     69 select * from recordInfo
     70 go
     71 
     72 ----update触发器示例
     73 create trigger tr_update_recordInfo
     74 on recordInfo
     75 for update
     76 as
     77 declare @beforePCId int
     78 declare @afterPCId int
     79 select @beforePCId =PCId from deleted
     80 select @afterPCId=PCID from inserted
     81 ---根据电脑编号修改使用状态-----
     82 ---根据以前使用的电脑编号把电脑的使用状态改为:
     83 update PCInfo set PCUse=0 where PCId=@beforePCId
     84 ---根据现在使用的电脑编号把电脑的使用状态改为:
     85 update PCInfo set PCUse=1 where PCId=@afterPCId
     86 ----显示电脑换机成功
     87 print'换机成功!从'+convert(varchar(10),@beforePCId)+'号电脑换到'+convert(varchar(10),@afterPCId)+'号电脑'
     88 go
     89 /*测试update触发器,修改电脑编号*/
     90 --显示更改前,记录表中的数据
     91 print'更改前,记录表中的数据'
     92 select * from recordInfo
     93 --显示更改前,电脑表中的数据
     94 print'更改前,电脑表中的数据'
     95 select * from PCInfo
     96 set nocount on
     97 ---把电脑号为的改为
     98 update recordInfo set PCId= where PCId= 
     99 ---查看结果
    100 print'更改后,记录表中的数据'
    101 select * from recordInfo
    102 print'更改后,电脑表中的数据'
    103 select * from PCInfo
    104 
    105 --instead of 触发器可以同时在数据表和视图中使用。通常在以下几种情况下,建议使用instead of触发器: 
    106 --1、数据库里的数据禁止修改:例如电信部门的通话记录是不能修改的,一旦修改,则通话费用的计数将不准确。 
    107 --2、有可能要回滚修改的SQL语句
    108 --3、在视图中使用触发器
    109 --4、用自己的方式去修改数据
    110 ----instead of触发器示例
    111 ---创建update触发器,在上网记录表recordInfo上创建修改(列)触发器
    112 create trigger tr_updateColum1_recordInfo
    113 on recordInfo
    114 instead of insert
    115 as
    116 declare @cardbalance int --声明用于存储用户余额的变量
    117 declare @CardId int --声明用于存储用户卡的编号的变量
    118 declare @PCId int --声明用于存储电脑编号的变量
    119 ---inserted临时表中获取插入的记录行信息,包括电脑编号、卡的编号
    120 select @cardId=cardId,@PCId=PCId from inserted
    121 select @cardbalance=cardBalance from cardInfo where CardId=@CardId
    122 print'您的余额为:'+convert(varchar(10),@cardBalance) ---打印余额信息
    123 if(@cardBalance<2) ---判断余额多少,看能否正常上机
    124 print'余额小于元,不能上机。请尽快充值!'
    125 else
    126 ----根据电脑的编号修改电脑的使用状态更改为正在使用
    127 update PCInfo set PCUse=1 where PCId=@PCId
    128 ----向recordInfo表插入上机记录
    129 insert into recordInfo(cardId,PCId,beginTime)values(@CardId,@PCId,getdate())
    130 print'上机成功'
    131 go
    132 -------关键代码------
    133 set nocount on
    134 declare @cardId int ---声明一个存储卡的编号的变量
    135 ---根据会员号查出卡的编号
    136 select @cardId=cardId from cardInfo where cardNumber='c001'
    137 ----向recordInfo表中插入一条记录信息,卡的编号、电脑的编号和上机时间
    138 insert into recordInfo(cardId,PCId,beginTime)values(@cardId,1,getdate())
    139 select * from recordInfo
    140 select * from PCInfo
    141 go
  • 相关阅读:
    HashMap和Hashtable及HashSet的区别
    Android获取系统的时间
    Android的布局属性
    ListView 在代码里设置margin
    如何用Vue自己实现一个message提示插件
    JS获取最近三个月日期范围
    css实现表单label文字两端对齐
    my utils
    Vue 路由&组件懒加载(按需加载)
    C# 通过window消息控制指定控件的scroll滚动
  • 原文地址:https://www.cnblogs.com/ziranquliu/p/5458441.html
Copyright © 2011-2022 走看看