触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程。

触发器主要是通过事件进行触发被自动调用执行的。而存储过程可以通过存储过程的名称被调用。

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触发器模板的更多相关文章

  1. SQL触发器实例讲解

    SQL触发器实例1 定义: 何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序.触发器是一个特殊的存储过程. 常见的触发器有三种:分别应用于Inser ...

  2. SQL触发器实例

    SQL触发器实例讲解(本文是来自百度文库) 备注:本人建了一个站特价汇,我想记录每个商品的点击量,然后按照点击量来牌名商品,想要提高效率,所以必须得用触发器,下面是本人在百度文库中的找到的学习资料,分 ...

  3. SQL触发器中的deleted表和inserted表

    SQL触发器中的deleted表和inserted表 在触发器语句中用两个特殊的表一个是deleted表和inserted.它们是通过触发器操作自动创建驻留在内存中的临时表. 描述: Deleted表 ...

  4. SQL 触发器(学生,课程表,选修表)

    SQL 触发器(学生,课程表,选修表) 触发器是一种特殊类型的存储过程,它不由用户通过命令来执行,而是在用户对表执行了插入,删除或修改表中数据等操作时激活执行.可以这样形容:存储过程像一个遥控炸弹,我 ...

  5. Oracle数据库之PL/SQL触发器

    Oracle数据库之PL/SQL触发器 1. 介绍 触发器(trigger)是数据库提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是 ...

  6. PB+MS SQL+触发器必须指出

    PB+MS SQL+触发器必须指出: 若触发器存在两笔以上的返回值,比方两条update 语句,被误判为数据有改变.存盘不成功. 提示: Row changed between retrieve an ...

  7. Oracle ORDS的简单SQL配置模板

    1. 先加上简单的SQL配置模板. DECLARE PRAGMA AUTONOMOUS_TRANSACTION; BEGIN ORDS.ENABLE_SCHEMA(p_enabled => TR ...

  8. SQL触发器实例(下)

    基本语法: Create Trigger [TriggerName] ON [TableName] FOR [Insert][,Delete][,Update] AS --触发器要执行的操作语句. G ...

  9. SQL 触发器-如何查看当前数据库中有哪些触发器

    在查询分析器中运行: use 数据库名goselect * from sysobjects where xtype='TR' sysobjects 保存着数据库的对象,其中 xtype 为 TR 的记 ...

随机推荐

  1. 【Android】Eclipse Memory Analyzer 进行堆内存溢出分析

    MAT 不是一个万能工具,它并不能处理所有类型的堆存储文件.     不同厂家的 JVM 所生成的堆转储文件在数据存储格式以及数据存储内容上有很多区别,但是比较主流的厂家和格式,例如 Sun, HP, ...

  2. paip.复制文件 文件操作 api的设计uapi java python php 最佳实践

    paip.复制文件 文件操作 api的设计uapi java python php 最佳实践 =====uapi   copy() =====java的无,要自己写... ====php   copy ...

  3. .NET Remoting学习笔记(三)信道

    目录 .NET Remoting学习笔记(一)概念 .NET Remoting学习笔记(二)激活方式 .NET Remoting学习笔记(三)信道 参考:♂风车车.Net .NET Framework ...

  4. iOS---性能优化

    最近采用Instruments 来分析整个应用程序的性能.发现很多有意思的点,以及性能优化和一些分析性能消耗的技巧.小结如下. Instruments使用技巧 关于Instruments官方有一个很有 ...

  5. 整站HTTPS后的跨域请求 CORS是否还有效?

    | 导语  手Q马上就要全量https了,很多业务都有跨域ajax请求的需求,原来使用的CORS头在HTTPS环境中还继续能用吗?我搜遍了谷歌.百度,都没看到有明确的答案,那么就自己来尝试一下吧. 关 ...

  6. JQ属性和css部分测试

    1.attr(name|properties|key,value|fn)  设置或返回被选元素的属性值. <div class="attr">设置或返回被选元素的属性值 ...

  7. 25数据查询的各种小玩法-select上(必学)-天轰穿sqlserver视频教程

    大纲:简单查询-选择数据列,使用字符串,改变列标题,使用数据运算 优酷超清地址,为了冲优酷的访问量,所以这里只放优酷的地址了,其实其他网站还是都传了的哈.

  8. 分享一些无特征PHP一句话

    分享些不需要动态函数.不用eval.不含敏感函数.免杀免拦截的一句话.(少部分一句话需要php5.4.8+.或sqlite/pdo/yaml/memcached扩展等) 原理:https://www. ...

  9. mysql慢日志设置

    mysql的慢日志查询对于sql的优化还是很有意义的,具体说下如何开启这个mysql慢查询日志(默认是开启的). 关于设置在mysql的官方手册或网上都有很多,但是要注意的是,mysql5.6与之前的 ...

  10. dubbo 管理控制台 的安装 dubbo-admin

    按照官方文档来,只是官方文档中提供的war包无法下载,我的环境至少是这样,不知道其他网络环境是否OK. war包下载地址:链接: http://pan.baidu.com/s/1i32fs7j 密码: ...