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

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

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. crossplatform---Nodejs in Visual Studio Code 09.企业网与CNPM

    1.开始 CNPM : https://npm.taobao.org/ 2.企业网HTTP代理上网 平时办公在一个大企业网(10.*.*.*)中,使用HTTP代理上网,发现npm命令无法执行. 解决方 ...

  2. C语言实现快速排序

    我觉得冒泡排序是比较简单的: 所以今天我们实现一个叫做快速排序的: Problem 你想要将(4,3,5,1,2)排序成(1,2,3,4,5) 你决定使用最简单的快速排序: Solution 首先,打 ...

  3. paip.花生壳 服务启动失败 以及不能安装服务,权限失败的解决

    paip.花生壳 服务启动失败 以及不能安装服务,权限失败的解决 系统win7 NewPhDDNS_1.0.0.30166.exe  作者Attilax  艾龙,  EMAIL:1466519819@ ...

  4. Dash

    作为一名死coder,每天最常见的动作就是查看各种API文档,你一定也有过同时打开N个窗口(HTML.PDF.CHM),不停的在编辑器与文档之间切换的感受吧?怎么说呢,其实我很讨厌这种枯燥无味的动作, ...

  5. css之选择器篇

    css能够获取到HTML结构上的元素,这个是怎么实现的了? 在我们看来这是个很神奇的事情,css可以写在页面之外,也可以写在页面内,而都不会影响到它去 获取这个元素,还有无论这个HTML结构多么复杂, ...

  6. TableView didSelectRowAtIndexPath 不执行

    1.父类事件设置代理 UIGestureRecognizer *tapGesture  ... tapGesture.delegate = self; 2.覆盖方法 - (BOOL)gestureRe ...

  7. 制作6寸 kindle pdf

    设置word 纸张大小为 90mm*117mm 然后保存为 pdf 就好了.

  8. 代码生成器Sql Server 和 Mysql 数据库脚本

    经常用到代码生成器,对于取数据脚本做个记录: #region SQL-SqlServer private string SqlTableList = @"SELECT so.name, Co ...

  9. 前沿技术解密——VirtualDOM

    作为React的核心技术之一Virtual DOM,一直披着神秘的面纱. 实际上,Virtual DOM包含: Javascript DOM模型树(VTree),类似文档节点树(DOM) DOM模型树 ...

  10. 用git写书

    apebook.org  www.apebook.org 最好的程序员图书免费托管服务 apebook 提供了 gitbook.com 类似的云端图书托管能力,图书基于广受欢迎的 gitbook 工具 ...