SQL Server 数据库的维护(二)__触发器
--维护数据库--
--触发器--
--概述:
触发器是一种特殊类型的存储过程,用来强制执行业务规则。在调用执上,触发器不能像存储过程那样可以由用户通过T-SQL语句直接调用,而是需要有数据库所发生的insert、update、delete事件的执行来激发触发器的自动执行。因此在创建和使用触发器时,需要考虑好触发事件的执行和被触发事件后,再设计和创建触发器,已完成用户需求。
触发器可以向约束一样,在数据表和视图中的数据发生改变时强制执行业务规则。在某种角度上,触发器要优于约束,因为触发器可以包含使用T-SQL语言编写的复杂代码,可以涉及其他数据表中的数据。约束能够完成的功能触发器都能可以做到,但它所给出的解决方案并不一定总是最好的。因此,约束和触发器在不同情况下各有优势。
与存储过程一样,创建触发器的语句必须存在于同一个批处理中。
--分类:按照触发事件的语言分类,可以将触发器分成DML触发器和DDL触发器。
1)DML触发器:是指可以被对数据表的insert、update和delete操作所触发的触发器。
2)DDL触发器:是指可以被数据库对象的create、alter、drop操作所触发的c触发器。
两种触发器的创建、修改和删除方法相似。
--DML触发器(详细介绍):
注:DML触发器按照触发器的触发和执行事件的不同,可分为after类型触发器和instead of类型触发器。
♦after类型触发器(后触发触发器):如果把被触发器封装的T-SQl语句所代表的事件称为“被触发事件”,把触发触发器执行的insert、update或者delete语句所代表的事件称为“触发事件”。after类型触发器即是时指“触发事件”成功执行完毕后,“被触发事件”执行的触发器。
after类型触发器只能创建在数据表上,而不能创建在视图上。一张数据表可以创建多个因同一触发操作而生成的触发器,但同一触发器操作所激发的触发器的执行顺序随机,可以通过对触发器禁用和恢复的方法设置执行那个触发器。
♦instead of类型触发器(替换触发器):简单地说,instead of类型的触发器当“触发事件”发生时,系统并不执行“触发事件”的具体操作(比如insert、update或者delete数据),而是直接执行“被触发事件”。
instead of类型触发器可以定义在表上和视图上。对于每个触发操作(insert、update或delete)只能定义一个instead of类型触发器。
--inserted表和deleted表
注:inserted表和deleted表是系统为每个触发器准备的临时表,存放于内存中。当触发器被触发执行时,inserted表和deleted表将记录触发器执行过程中设计的每条记录信息,以方便用户使用和查询。inserted表和deleted表中的记录只能查看,不能修改,当触发器执行完毕后,与之相关的临时表也随之删除。
没有“updated”表,update作为修改操作,既相当与删除数据再添加数据,因此,当触发操作作为update命令时,即生成deleted表又生成inserted表。
♦inserted表
inserted表用来存放当触发操作为insert命令所产生的数据信息。该表的结构与insert命令所作用的表结构相同,表中信息作为副本存储,且只存储新发生的记录信息。
♦deleted表
deleted表用来存放当触发操作为delete命令所产生的数据信息。该表的结构与delete命令所作用的表结构相同,表中信息作为副本存储,且只存储新发生的记录信息。
--触发器管理--
--创建触发器(create trigger)--
注:在SQL Server中,触发器可以是使用“管理器”和T-SQL语言两种方式创建。执行触发器其实即是执行了定义触发器时的触发命令(insert、update和delete)。
create trigger 触发器名 --create trigger命令表示创建触发器,该命令要求是批处理中的第一句话。
on 数据表名 --“on 数据表名”指“触发事件”发生的数据表。
[with encryption] --with encryption语句可以对创建不同类型的触发器。
after | instead of [insert] [, update] [,delete] --after和instead of是可选项,用来创建不同类型的触发器。insert、update、delete是执行操作,可以单选也可以多选,没有先后顺序。
as --as后的T-SQl语句是“被触发事件”。
T-SQl语句
例1:(after类型触发器)(创建名为“t_客户信息表_电话”的触发器,当“商品管理数据库”中“客户信息表”的客户编号为20130001的客户联系电话修改为13600003333操作成功执行后,在结果打印一条“记录已修改!”的提示信息。) --创建触发器
use 商品管理数据库
go
create trigger t_客户信息表_电话
on 客户信息表
after update --after类型触发器
as
print '记录已修改!'
select*from 客户信息表 --执行“触发事件”激发触发器执行
use 商品管理数据库
go
update 客户信息表
set 联系电话='' where 客户编号=''
go 例2:(instead of类型触发器)(创建名为“t_客户信息表_电话no”的触发器,当“商品管理数据库”中“客户信息表”的客户编号为20130001的客户联系电话修改为13600004444时,不执行修改操作,并在结果打印一条“记录未修改!”的提示信息。) --创建触发器
use 商品管理数据库
go
create trigger t_客户信息表_电话no
on 客户信息表
instead of update
as
print '记录未修改!'
select*from 客户信息表 --执行“触发事件”激发触发器执行
use 商品管理数据库
go
update 客户信息表
set 联系电话=''
where 客户编号='' 例3:(after类型触发器)(当“商品管理数据库”中有商品售出时,除了向“销售信息表”中添加销售记录之外,还应该为“库存信息表”中相应商品减掉与销售数量等值的库存数量。创建名为“t_销售表_库存表”的触发器。)
use 商品管理数据库
go
create trigger t_销售表_库存表
on 销售信息表
after insert
as
update 库存信息表
set 库存数量=库存数量-(select 销售数量 from inserted) --查询“库存信息表”商品编号为11110003的商品现有数量
select*from 库存信息表 where 商品编号=''
--向“销售信息表”添加商品编号wei11110003的商品售出10个记录,以激发存储过程。
use 商品管理数据库
go
insert 销售信息表 values(8,'',2.5,10,50,'2012-12-21',20130004)
--查询“库存信息表”商品编号为11110003的商品现有数量,与之前作比较
select*from 库存信息表 where 商品编号=''
理解例子
--查看触发器
注:由于触发器是特殊的存储过程,因此可以使用系统存储过程查看触发器相关信息。
exec 系统存储过程 用户自定义存储过程名
--sp_depends:查看触发器的依赖关系
--sp_help:查看触发器的创建信息
--sp_helptext:查看触发器的创建文本(被加密的触发器无法查看)
exec sp_helptrigger 数据表名
--sp_helptrigger:查看某张数据表中创建了那些类型的触发器
例:(查看“商品管理数据库”的“销售信息表”中创建了那些触发器,查看已创建的触发器信息)
use 商品管理数据库
go
exec sp_helptrigger 销售信息表
例:
use 商品管理数据库
go
exec sp_depends t_销售表_库存表
exec sp_help t_销售表_库存表
exec sp_helptext t_销售表_库存表
--修改触发器
注:无论是修改触发器名称还是功能,都会对该触发器有关联的数据表或数据表中的字段产生影响,因此请根据需要谨慎修改。
类似于修改存储过程,修改触发器也相当于删除了原来的触发器功能,创建了新的触发器功能。
1)
alter trigger 触发器名
on 数据表名
[with encryption]
after | instead of [insert] [, update] [, delete]
as
T-SQL语句
2)
也可以使用系统存储过程sp_rename为触发器重命名:
exec sp_rename 原触发器名,新触发器名
--启用触发器
enable trigger 触发器名 on 数据表名
例:(启用“销售信息表”中的触发器“t__销售表_库存表”)
use 商品管理数据库
go
disable trigger t__销售表_库存表 on 销售信息表
--禁用触发器
disable trigger 触发器名 on 数据表名
例:(禁用“销售信息表”中的触发器“t__销售表_库存表”)
use 商品管理数据库
go
disable trigger t__销售表_库存表 on 销售信息表
--删除触发器
drop trigger 触发器名
例:
use 商品管理数据库
go
drop trigger t_销售表_库存表
注:"--"可看成说明或者注释文本
SQL Server 数据库的维护(二)__触发器的更多相关文章
- SQL Server 数据库的维护(三)__事务(transaction)和锁
--维护数据库-- --事务(transaction)和锁-- --事务(transaction)-- --概述: 事务是指封装了一组T-SQL语句的单个逻辑单元.单元中的所有语句作为一个整体,在满足 ...
- SQL Server 数据库的维护(一)__存储过程(procedure)
--维护数据库-- --存储过程(procedure)-- --概述: SQl Serve的存储过程是由一个或多个T-SQL语句组成的一个集合.常用的程序代码段通常被创建成存储过程,一次创建多次调用, ...
- SQL Server 数据库的维护(四)__游标(cursor)
--维护数据库-- --游标(cursor)-- --概述: 注:使用select语句查询结果的结果集是一个整体,如果想每次处理一行或一部分行数据,游标可以提供这种处理机制.可以将游标理解为指针.指针 ...
- 牢记!SQL Server数据库开发的二十一条注意点
如果你正在负责一个基于SQL Server的项目,或者你刚刚接触SQL Server,你都有可能要面临一些数据库性能的问题,这篇文章会为你提供一些有用的指导(其中大多数也可以用于其它的DBMS). ...
- SQL Server数据库开发的二十一条军规
如果你正在负责一个基于SQL Server的项目,或者你刚刚接触SQL Server,你都有可能要面临一些数据库性能的问题,这篇文章会为你提供一些有用的指导(其中大多数也可以用于其它的DBMS).在这 ...
- SQL Server 数据库DML触发器 【一】
今天学习SQL Server数据库中DML触发器(DDL触发器以后有时间继续学习). 当删除一条创建有触发器的表中的内容时,触发器执行SQL语句. 1.首相先创建一张表,表名称是 [Test] , 内 ...
- C#连接SQL Server数据库(二)
执行SQL语句:Command对象 1.Command对象概述 Command对象是一个数据命令对象,主要功能是向数据库发送查询.更新.删除.修改操作的SQL语句.Command对象主要有以下几种 ...
- 5、SQL Server数据库、T-SQL
SQL Server数据库基础 一.安装SQL Server数据库 setup.exe->安装->全新SQL Server独立安装或向现有安装添加功能->输入序列号->下一步- ...
- C#面试题(转载) SQL Server 数据库基础笔记分享(下) SQL Server 数据库基础笔记分享(上) Asp.Net MVC4中的全局过滤器 C#语法——泛型的多种应用
C#面试题(转载) 原文地址:100道C#面试题(.net开发人员必备) https://blog.csdn.net/u013519551/article/details/51220841 1. . ...
随机推荐
- 小表驱动大表, 兼论exists和in
给出两个表,A和B,A和B表的数据量, 当A小于B时,用exists select * from A where exists (select * from B where A.id=B.id) ex ...
- Spring事务管理(转)
Spring是SSH中的管理员,负责管理其它框架,协调各个部分的工作.今天一起学习一下Spring的事务管理.Spring的事务管理分为声明式跟编程式.声明式就是在Spring的配置文件中进行相关配置 ...
- 线程Thread,有参数和参数
一.不带参数的 using System; using System.Collections.Generic; using System.Text; using System.Threading; n ...
- 浅谈C语言变量声明的解析
C语言本身提供了一种不甚明确的变量声明方式——基于使用的声明,如int *a,本质上是声明了*a的类型为int,所以得到了a的类型为指向int的指针.对于简单类型,这样声明并不会对代码产生多大的阅读障 ...
- 【javascript进阶】异常
前言 最近有些时间了,今天看了看博客的后台记录,好多都没有写博客呢,争取尽快把以前的补上,javascrit中的异常在前端大家用的好像不是很多,其实javascript的异常和大多数的后端语言差不大, ...
- deep learning 练习1 线性回归练习
线性回归练习 跟着Andrew Ng做做练习:http://openclassroom.stanford.edu/MainFolder/DocumentPage.php?course=DeepLear ...
- dbms_output.put_line 不显示
再写oracle sql时候,写循环语句,想知道循环对不对,使用dbms_output.put_line()没有打印出任何东西,网上查找发现少了一句. 加上 set serverouput on 就 ...
- 第一次用阿里云ecs配置pptp vpn遇到的问题。
在国外没办法使用一些国内一些涉及版权的网站,各种音乐和视频都没法看很不爽.自己租了个ecs.vps上安装vpn网上很多教程,但是有些地方只是copy上去还是不行的,得根据vps的具体情况改动一下才可以 ...
- 修改.gitignore后让其生效
在使用git的时候我们有时候需要忽略一些文件或者文件夹.我们一般在仓库的根目录创建.gitignore文件在提交之前,修改.gitignore文件,添加需要忽略的文件.然后再做add commit p ...
- ubuntu12.04安装WineQQ2012
1:下载WineQQ2012-20120531-Longene.deb 2:直接用软件中心安装或者执行命令,进入文件目录执行sudo dpkg -i WineQQ2012-20120531-Longe ...