SQLServer触发器的使用
创建:
- create trigger trigger_name
- on {table_name view_name}
- {for After Instead of }
- [ insert, update,delete ]
- as
- sql_statement
删除触发器:
- drop trigger trigger_name
查看数据库中已有触发器:
- use jxcSoftware
- go
- select * from sysobjects where xtype='TR'
修改触发器:
- alter trigger trigger_name
- on {table_name view_name}
- {for After Instead of }
- [ insert, update,delete ]
- as
- sql_statement
触发器禁用与启用
禁用:
- ALTER TABLE trig_example DISABLE TRIGGER trig1
- GO
恢复:
- ALTER TABLE trig_example ENABLE TRIGGER trig1
- GO
--禁用某个表上的所有触发器
- ALTER TABLE 你的表 DISABLE TRIGGER all
--启用某个表上的所有触发器
- ALTER TABLE 你的表 enable TRIGGER all
--禁用所有表上的所有触发器
- exec sp_msforeachtable 'ALTER TABLE ? DISABLE TRIGGER all'
--启用所有表上的所有触发器
- exec sp_msforeachtable 'ALTER TABLE ? enable TRIGGER all'
触发器的知识点
一: 触发器是一种特殊的存储过程﹐它不能被显式地调用﹐而是在往表中插入记录﹑更新记录或者删除记录时被自动地激活。所以触发器可以用来实现对表实施复杂的完整性约束。
二: SQL Server为每个触发器都创建了两个专用表:Inserted表和Deleted表。这两个表。
一: 触发器是一种特殊的存储过程﹐它不能被显式地调用﹐而是在往表中插入记录﹑更新记录或者删除记录时被自动地激活。所以触发器可以用来实现对表实施复杂的完整性约`束。
二: SQL Server为每个触发器都创建了两个专用表:Inserted表和Deleted表。这两个表由系统来维护﹐它们存在于内存中而不是在数据库中。这两个表的结构总是与被该触发器作用的表的结构相同。触发器执行 完成后﹐与该触发器相关的这两个表也被删除。
Deleted表存放由于执行Delete或Update语句而要从表中删除的所有行。
Inserted表存放由于执行Insert或Update语句而要向表中插入的所有行。

三:Instead of 和 After触发器
SQL Server2000提供了两种触发器:Instead of 和After 触发器。这两种触发器的差别在于他们被激活的同:
Instead of触发器用于替代引起触发器执行的T-SQL语句。除表之外﹐Instead of 触发器也可以用于视图﹐用来扩展视图可以支持的更新操作。
After触发器在一个Insert,Update或Deleted语句之后执行﹐进行约束检查等动作都在After触发器被激活之前发生。After触发器只能用于表。
一个表或视图的每一个修改动作(insert,update和delete)都可以有一个instead of 触发器﹐一个表的每个修改动作都可以有多个After触发器。
两种触发器的工作流程:
Instead of:
SQL Server接到执行SQL语句请求->建立临时的Inserted 表与Deleted表->触发Instead Of触发器->结束。注意:此触发器将代替原来要执行的Insert、Delete 或update操作;
例如:A表有一个关于Instead of Insert 的触发器,向A表插入一行数据时,触发器将要代替“向A表插入一行数据的操作”,至于什么操作,由触发器的内容决定;
用途:
1.多表连接的视图数据更新,可以写相应的Instead of 语句去更新多个表;
2.数据库某些表禁止进行Insert、Delete、Update,则可以写Instead of Insert、Instead of Delete、Instead of Update来屏蔽原来要进行的操作。
After/for:
SQL Server接到执行SQL语句请求->建立临时的Inserted 表与Deleted表->执行SQL语句->触发Instead Of触发器->结束。
.一个操作同时存在于Instead of 与After中时,Instead of
的一定会执行,After的则不一定会执行。如果Instead里执行的是非激活类型的操作,则不会执行After里面同种类型的操作。例
如:Insert语句同时存在于Instead of 与After中,如果Instead of Insert
里面执行的是非本表的Insert语句操作,那么After Insert 就不会执行了。
四:触发器的执行过程
如果一个Insert﹑update或者delete语句违反了约束﹐那幺After触发器不会执行﹐因为对约束的检查是在After触发器被激动之前发生的。所以After触发器不能超越约束。
Instead of 触发器可以取代激发它的操作来执行。它在Inserted表和Deleted表刚刚建立﹐其它任何操作还没有发生时被执行。因为Instead of 触发器在约束之前执行﹐所以它可以对约束进行一些预处理。
实例:
1:在Orders表中建立触发器﹐当向Orders表中插入一条订单记录时﹐检查goods表的货品状态status是否为1(正在整理)﹐是﹐则不能往Orders表加入该订单。
- create trigger orderinsert
- on orders
- after insert
- as
- if (select status from goods,inserted
- where goods.name=inserted.goodsname)=1
- begin
- print 'the goods is being processed'
- print 'the order cannot be committed'
- rollback transaction --回滚﹐避免加入
- end
2:在Orders表建立一个插入触发器﹐在添加一条订单时﹐减少Goods表相应的货品记录中的库存。
- create trigger orderinsert1
- on orders
- after insert
- as
- update goods set storage=storage-inserted.quantity
- from goods,inserted
- where
- goods.name=inserted.goodsname
3:在Goods表建立删除触发器﹐实现Goods表和Orders表的级联删除。
- create trigger goodsdelete
- on goods
- after delete
- as
- delete from orders
- where goodsname in
- (select name from deleted)
instead of 触发器的用法
INSTEAD OF 触发器的主要优点是可以使不能更新的视图支持更新。基于多个基表的视图必须使用
INSTEAD OF触发器来支持引用多个表中数据的插入、更新和删除操作。INSTEAD
OF触发器的另一个优点是使您得以编写这样的逻辑代码:在允许批处理的其他部分成功的同时拒绝批处理中的某些部分。
Transact-SQL语句创建两个基表、一个视图和视图上的INSTEAD
OF触发器。以下表将个人数据和业务数据分开并且是视图的基表。
/*在视图上定义 instead of insert触发器以在一个或多个基表中插入数据。*/
--部门表
create table dept
(
d_id int primary key,
d_name varchar(20)
)
--员工表
create table emp
(
e_id int primary key,
e_name varchar(20),
d_id int references dept(d_id)
)
select * from emp
drop view v
create view v
as
select e_id,e_name,d.d_id,d_name from emp e,dept d where e.d_id=d.d_id
select * from v
insert into v values(1001,'张珊',101,'销售部')
/*******************使用instead of触发器******************/
drop trigger de_em_insert
go
create trigger de_em_insert
on v
instead of insert
as
begin
if (not exists (select d.d_id from dept d, inserted i where d.d_id = i.d_id))
insert into dept select d_id,d_name from inserted
if (not exists (select e.d_id from emp e, inserted i where e.d_id = i.d_id))
insert into emp select e_id,e_name,d_id from inserted
else
update emp set e_id = i.e_id,e_name = i.e_name from emp e, inserted i where e.d_id = i.d_id
end
可以在视图或表中定义 INSTEAD OF DELETE触发器,以代替
DELETE语句的标准操作。通常,在视图上定义 INSTEAD OF DELETE触发器以便在一个或多个基表中修改数据。
可在视图上定义 INSTEAD OF UPDATE 触发器以代替 UPDATE语句的标准操作。通常,在视图上定义 INSTEAD OF UPDATE
触发器以便修改一个或多个基表中的数据
SQLServer触发器的使用的更多相关文章
- SqlServer触发器的理解
SqlServer触发器是与表事件相关的特殊存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发.比如当对一个表进行操作( insert,delete, update)时就会激活它执行. ...
- 一次SQLSERVER触发器编写感悟
背景:BOSS须要我写一个工厂採集端到server端的数据同步触发器,数据库採用的是sqlserver2008 需求:将多台採集机的数据同步到server中,假设採集端数据库与server数据库连接失 ...
- SQLServer触发器调用JavaWeb接口
这几天接到一个需求需要吧不同系统的数据库进行同步,需要我做一个中间平台进行连接,瞬间就想到了触发器调用接口然后通过API进行传递再写入另一个数据库. sqlServer触发器调用JavaWeb接口 1 ...
- SqlServer——触发器
一:触发器基本知识 1.首先必须明确以下几点: 触发器是一种特殊的存储过程,但没有接口(输入输出参数),在用户执行Inserted.Update.Deleted 等操作时被自动触发: 当触发的SQL ...
- SQLServer 触发器入门
阅读目录 一:触发器的优点 二:触发器的作用 三:触发器的分类 四:触发器的工作原理 五:创建触发器 六:管理触发器 概念: 触发器(trigger)是SQL server 提供给程序员和数据分析 ...
- SqlServer触发器的基础知识
触发器的基础知识:create trigger tr_name on table/view{for | after | instead of } [update][,][insert][,][dele ...
- SqlServer触发器的创建与使用
前言 上期我们介绍了SqlServer的视图和存储过程创建与使用,这期我们介绍一下触发器. 有需要回顾的可以电梯直达看一下: SqlServer视图的创建与使用 SqlServer存储过程的创建与使用 ...
- SQLServer触发器创建、删除、修改、查看
一: 触发器是一种特殊的存储过程﹐它不能被显式地调用﹐而是在往表中插入记录﹑更新记录或者删除记录时被自动地激活.所以触发器可以用来实现对表实施复杂的完整性约束. 二: SQL Server为每个触发器 ...
- SqlServer触发器判断对表操作类型(增、删、改)并将修改后的数据映射到新表
该文章为原创,日后可能会根据实际开发经验和网友评论,进行相应地方修改,为获得最新博客动态,望在转发博客的时候注明出处. 触发器要实现的功能: (1)获取对表Table1数据操作操作类型(insert. ...
- SqlServer 触发器
--创建insert类型的触发器create trigger tgr_product_insert --创建触发器 on product --所针对的表 for insert --触发 ...
随机推荐
- Codeforces Gym 100015A Another Rock-Paper-Scissors Problem 找规律
Another Rock-Paper-Scissors Problem 题目连接: http://codeforces.com/gym/100015/attachments Description S ...
- C#操作Excel(2)-- 打开-读取Excel文档
由于要为某软件实现导出Excel功能,故有此文. 本文的开发环境是Visual Studio 2010 ,C#, Excel 2007. 新建C#工程后打开Solution Explorer,可以看到 ...
- C#操作注册表全攻略
相信每个人对注册表并不陌生,在运行里面输入“regedit”就可以打开注册表编辑器了.这东西对Windows系统来说可是比较重要的,也是病 毒常常会光顾的地方,比如病毒和恶意软件常常会在注册表的启动项 ...
- ECLIPSE android 布局页面文件出错故障排除Exception raised during rendering: java.lang.System.arraycopy([CI[CII)V
在布局添加控件手动添加还是拖的添加,添加edittext后布局就不好用,其他控件好用,然后就说下面这段话 Exception raised during rendering: java.lang.Sy ...
- MyBatis中主要类的生命周期和应用范围
转自:http://ccchhhlll1988-163-com.iteye.com/blog/1420026 MyBatis中常用的类就要数SqlSessionFactoryBuilder.SqlSe ...
- 推荐几个可以与PhoneGap很好搭配的UI框架
- xui.js:可以被视作是jquery在phonegap上的替代品,挺好用的- jq.mobi:同上,不过体积比xui.js要大,一般还是用xui.js- jq.ui:jq.mobi配套的UI框架 ...
- 使用Ant命令压缩JavaScript文件
压缩JavaScript文件可以减少代码尺寸,保护源代码,节省网络带宽,加快页面打开速度,甚至优化JS代码.Yahoo有一个压缩JS的工具叫做YUI compressor, Google也有一个工具叫 ...
- pthread_mutex_t
在Linux中使用线程 http://blog.csdn.net/jiajun2001/article/details/12624923 :LINUX就是这个范围作者 原创作品,允许转载,转载时 ...
- Action 和 Func
C# 中的两个动态委托类型 也就是说我们不用在使用委托的时候就去声明一个委托对象,而是通过Action和Func就可以模拟出我们自己要用到的委托 区别: Action 表示没有返回值的委托 例如:A ...
- 经典排序算法总结与实现 ---python
原文:http://wuchong.me/blog/2014/02/09/algorithm-sort-summary/ 经典排序算法在面试中占有很大的比重,也是基础,为了未雨绸缪,在寒假里整理并用P ...