Sql触发器模板
触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程。
触发器主要是通过事件进行触发被自动调用执行的。而存储过程可以通过存储过程的名称被调用。
SQL Server 2005中触发器可以分为两类:DML触发器和DDL触发器,其中DDL触发器它们会影响
多种数据定义语言语句而激发,这些语句有create、alter、drop语句。
(在此仅讨论DML触发器)
DML触发器分为:
1、 after触发器(之后触发)
a、 insert触发器
b、 update触发器
c、 delete触发器
2、 instead of 触发器 (之前触发)
其中after触发器要求只有执行某一操作insert、update、delete之后触发器才被触发,且只能定义在表上。
而instead of触发器表示并不执行其定义的操作(insert、update、delete)而仅是执行触发器本身。
既可以在表上定义instead of触发器,也可以在视图上定义。
触发器有两个特殊的表:插入表(instered表)和删除表(deleted表)。这两张是逻辑表也是虚表。
有系统在内存中创建者两张表,不会存储在数据库中。而且两张表的都是只读的,只能读取数据而不能修改数据。
这两张表的结果总是与被改触发器应用的表的结构相同。当触发器完成工作后,这两张表就会被删除。
Inserted表的数据是插入或是修改后的数据,而deleted表的数据是更新前的或是删除的数据。
|
对表的操作 |
Inserted逻辑表 |
Deleted逻辑表 |
|
增加记录(insert) |
存放增加的记录 |
无 |
|
删除记录(delete) |
无 |
存放被删除的记录 |
|
修改记录(update) |
存放更新后的记录 |
存放更新前的记录 |
Update数据的时候就是先删除表记录,然后增加一条记录。这样在inserted和deleted表就都有update后的数据记录了。
注意:触发器本身就是一个事务,所以在触发器里面可以对修改数据进行一些特殊的检查。如果不满足可以利用事务回滚,撤销操作。
--创建insert插入类型触发器
if (object_id('Trg_班级表_insert', 'tr') is not null)
drop trigger Trg_班级表_insert
go
create trigger Trg_班级表_insert
on 班级表
for insert --插入触发
as
--定义变量
declare @id int, @name varchar(20);
--在inserted表中查询已经插入记录信息
select @id = id, @name = name from inserted;insert into 学生表 values(@name, 18 + @id, @id);
print '添加学生成功!';
go
--测试插入数据
--insert触发器,会在inserted表中添加一条刚插入的记录。
insert into 班级表 values('5班', getDate());
--查询数据
select * from 班级表 ;
select * from 学生表 order by id;
--delete删除类型触发器
if (object_id('Trg_班级表_delete', 'TR') is not null)
drop trigger Trg_班级表_delete
go
create trigger Trg_班级表_delete
on 班级表
for delete --删除触发
as
print '备份数据中……';
if (object_id('班级备份表', 'U') is not null)
--存在classesBackup,直接插入数据
insert into 班级备份表
select name, createDate from deleted;
else
--不存在班级备份表,创建再插入
select * into 班级备份表 from deleted;
print '备份数据成功!';
go
--
--不显示影响行数
--set nocount on;
--delete触发器会在删除数据的时候,将刚才删除的数据保存在deleted表中
delete 班级表 where name = '5班';
--查询数据
select * from 班级表;
select * from 班级备份表;
--update更新类型触发器
if (object_id('Trg_班级表_update', 'TR') is not null)
drop trigger Trg_班级表_update
go
create trigger Trg_班级表_update
on 班级表
for update
as
declare @oldName varchar(20), @newName varchar(20);
--更新前的数据
select @oldName = name from deleted;
if (exists (select * from 学生表 where name like '%'+ @oldName + '%'))
begin
--更新后的数据
select @newName = name from inserted;
update 学生表 set name = replace(name, @oldName, @newName) where name like '%'+ @oldName + '%';
print '级联修改数据成功!';
end
else
print '无需修改学生表!';
go
--查询数据
--update触发器会在更新数据后,将更新前的数据保存在deleted表中,更新后的数据保存在inserted表中
select * from 学生表 order by id;
select * from 班级表;
update 班级表 set name = '五班' where name = '5班';
--update更新列级触发器
if (object_id('Trg_班级表_update_column', 'TR') is not null)
drop trigger Trg_班级表_update_column
go
create trigger Trg_班级表_update_column
on 班级表
for update
as
--列级触发器:是否更新了班级的字段[创建时间]
if (update(createDate))
begin
raisError('系统提示:班级创建时间不能修改!', 16, 11);
rollback tran;
end
go
--测试
--更新列级触发器可以用update是否判断更新列记录;
select * from 学生表 order by id;
select * from 班级表;
update 班级表 set createDate = getDate() where id = 3;
update 班级表 set name = '四班' where id = 7;
--创建instead of触发器
if (object_id('Trg_班级表_inteadOf', 'TR') is not null)
drop trigger Trg_班级表_inteadOf
go
create trigger Trg_班级表_inteadOf
on 班级表
instead of delete/*, update, insert*/
as
declare @id int, @name varchar(20);
--查询被删除的信息,病赋值
select @id = id, @name = name from deleted;
print 'id: ' + convert(varchar, @id) + ', name: ' + @name;
--先删除学生表的信息
delete 学生表 where cid = @id;
--再删除班级表的信息
delete 班级表 where id = @id;
print '删除[ id: ' + convert(varchar, @id) + ', name: ' + @name + ' ] 的信息成功!';
go
--test
select * from 学生表 order by id;
select * from 班级表;
delete 班级表 where id = 7;
--创建触发器语法
create trigger Trg_name
on table_name
with encrypion –加密触发器
for update...
as
Transact-SQL
--显示自定义消息raiserror
if (object_id('Trg_message', 'TR') is not null)
drop trigger Trg_message
go
create trigger Trg_message
on 学生表
after insert, update
as raisError('Trg_message触发器被触发', 16, 10);
go
--test
insert into 学生表 values('lily', 22, 1, 7);
update 学生表 set sex = 0 where name = 'lucy';
select * from 学生表 order by id;
--禁用触发器
disable trigger Trg_message on 学生表;
--启用触发器
enable trigger Trg_message on 学生表; --查询已存在的触发器
select * from sys.triggers;
select * from sys.objects where type = 'TR'; --查看触发器触发事件
select te.* from sys.trigger_events te join sys.triggers t
on t.object_id = te.object_id
where t.parent_class = 0 and t.name = 'tgr_valid_data'; --查看创建触发器语句
exec sp_helptext 'Trg_message';
Sql触发器模板的更多相关文章
- SQL触发器实例讲解
SQL触发器实例1 定义: 何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序.触发器是一个特殊的存储过程. 常见的触发器有三种:分别应用于Inser ...
- SQL触发器实例
SQL触发器实例讲解(本文是来自百度文库) 备注:本人建了一个站特价汇,我想记录每个商品的点击量,然后按照点击量来牌名商品,想要提高效率,所以必须得用触发器,下面是本人在百度文库中的找到的学习资料,分 ...
- SQL触发器中的deleted表和inserted表
SQL触发器中的deleted表和inserted表 在触发器语句中用两个特殊的表一个是deleted表和inserted.它们是通过触发器操作自动创建驻留在内存中的临时表. 描述: Deleted表 ...
- SQL 触发器(学生,课程表,选修表)
SQL 触发器(学生,课程表,选修表) 触发器是一种特殊类型的存储过程,它不由用户通过命令来执行,而是在用户对表执行了插入,删除或修改表中数据等操作时激活执行.可以这样形容:存储过程像一个遥控炸弹,我 ...
- Oracle数据库之PL/SQL触发器
Oracle数据库之PL/SQL触发器 1. 介绍 触发器(trigger)是数据库提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是 ...
- PB+MS SQL+触发器必须指出
PB+MS SQL+触发器必须指出: 若触发器存在两笔以上的返回值,比方两条update 语句,被误判为数据有改变.存盘不成功. 提示: Row changed between retrieve an ...
- Oracle ORDS的简单SQL配置模板
1. 先加上简单的SQL配置模板. DECLARE PRAGMA AUTONOMOUS_TRANSACTION; BEGIN ORDS.ENABLE_SCHEMA(p_enabled => TR ...
- SQL触发器实例(下)
基本语法: Create Trigger [TriggerName] ON [TableName] FOR [Insert][,Delete][,Update] AS --触发器要执行的操作语句. G ...
- SQL 触发器-如何查看当前数据库中有哪些触发器
在查询分析器中运行: use 数据库名goselect * from sysobjects where xtype='TR' sysobjects 保存着数据库的对象,其中 xtype 为 TR 的记 ...
随机推荐
- paip.slap工具与于64位win7与JDBC的性能对比
paip.slap工具与于64位win7与JDBC的性能对比 作者Attilax 艾龙, EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog ...
- DES加密 java与.net可以相互加密解密的方法
我.net程序员.今天和java的童鞋交互,单点登录的操作.采用了如下的加密和解密的方式.经过验证,完美结合.通过这个方法可以实现java和C#相互加密与解密 并能保持解密出来一致. 废话少说,上代码 ...
- iOS中dyld缓存的实现原理是怎样的?
在iOS开发中,为了提升系统的安全性,很多系统库文件都被打包到一个缓存的文件当中即dyld缓存,那大家对dyld缓存了解多少呢?今天小编将和大家分享的就是一位iOS大神对dyld缓存的使用分析,一起来 ...
- INNO安装卸载自动结束进程插件使用
[Code] //安装前判断是否有进程正在运行,istask.dll文件与打包的exe文件一起function RunTask(FileName: string; bFullpath: Boolean ...
- 【转】BitKeeper与Linux,git史前琐事
http://www.path8.net/tn/archives/6039 维持数年的BitKeeper与Linux的关系最终还是落入了好莱坞明星婚姻式的结局.他们曾经相得益彰,最后却走到这个遗憾的地 ...
- 配置editplus,讓其支持代碼自動格式化功能.
使用editplus已經好多年了,累積了不少的東西,想換IDE比較麻煩,所以就研究了一下用editplus搭配gofmt.exe配置go語言代碼自動格式化的功能.還好功夫不負有心人,終於被我搞懂了,不 ...
- 针对远程Git代码库使用SSH公匙
→ 运行Git Bash→ 创建SSH公匙和私匙ssh-keygen -t rsa→ 输入SSH公匙存放文件,选择使用默认的,按Enter→ 如果已经存在,提示是否重写,输入n,按Enter→ 打开C ...
- Meanshift filter实现简单图片的卡通化效果
利用Meanshift filter和canny边缘检测的效果,可以实现简单的图片的卡通化效果.简单的说,就是用Meanshift filter的结果减去canny算法的结果得到卡通化的效果. ...
- Zabbix监控Windows事件日志
1.zabbix_agentd.win文件修改: LogFile=c:\zabbix\zabbix_agentd.log Server=1.16.2.4 ServerActive=1.16.2.4 H ...
- Markdown学习语法的记录
标题示例 === 标题示例 ---- #标题示例 ##标题示例 ###标题示例 >引用示例 >>引用示例 >>> 引用示例 _斜体示例_ *斜体示例* __粗体示例 ...