SQL Server 触发器

触发器是一种特殊的存储过程,只有当试图用数据操作语言DML来修改数据时才会触发,DML包含对视图和表的增、删、改。

触发器分为DML触发器和DDL触发器,其中DML触发器会对数据表,视图进行insert、update、delete的时候触发。DDL则是create、alter、drop等时触发。

DML触发器又分为after(之后触发)和insert of(之前触发)触发器。

如果在创建触发器的时候不指定类型,则默认是after触发器。

触发器有两个虚拟的临时表:插入表(inserted)和删除表(deleted),由系统在内存中创建,不会保存到数据库。并且两张表都是只读的。当触发器完成工作后,这两张表会自动删除。

增加:inserted表 记录

删除:deleted表  记录

修改:inserted表记录修改前 deleted表记录修改后

修改数据时现删掉该记录,然后再增加一天新的记录。这样inserted和updated就都存在记录了。

触发器本身就是一个事务,可以利用事务的回滚,撤销操作。事务就是要么都执行,要么一条都不执行。

创建触发器

语法:

create trigger [shema_name . ] trg_name
on { table | view }
[ with encryption ]
{ for | after | instead of }
{ insert , update , delete }
as
sql_statement

创建insert触发器

if(object_id('tgr_test_insert','tr') is not null)
drop trigger tgr_test_insert --删除触发器
go
create trigger tgr_test_insert
on student --创建在student表
for insert --insert触发
as
declare @id int,@name varchar(20),@sex char(2),@age int
--查询inserted表中已经插入的信息
select @id = id,@name = name,@sex = sex, @age = age from inserted
--用查到的信息加入到会员表中
if(@age >30) --如果年龄不符合 则修改
begin
update student set age = 30 where id = @id
print '年龄太大,已自动修改为30'
end
insert into [user] (userName,passWord,RoleId) values (@name,@sex + cast(@age as varchar),3)
print '添加学生成功!';
print '添加会员成功!'

对student表创建触发器后对该表执行insert后

insert into student (name,sex,age,mail) values ('海盗船长','男',88,'853020304@qq.com')

查看运行结果

创建update触发器

if(object_id('tgr_student_update','tr') is not null)
drop trigger tgr_student_update
go
create trigger tgr_student_update
on student
for update
as
declare @oldName varchar(10),@newName varchar(10)
select @oldName = name from deleted; --查找更新前的数据
select @newName = name from inserted;--查找更新后的数据
if(@oldName = @newName)
begin
print '数据相同'
rollback tran; --回滚 不执行修改操作
end
else
print '修改成功'
update student set name='海盗船长' 

事务在触发器中结束。批处理已中止。

update student set name='粉红娘娘'

修改成功

创建delete触发器

if(object_id('tgr_student_delete','tr')is not null)
drop trigger tgr_student_delete
go
create trigger tgr_student_delete
on student
for delete
as
if(exists(select * from sys.databases where name = 'studentBackup'))
insert into studentBackup select name,sex,age,mail from deleted;
else
print '不存在,创建再插入'
create table studentBackup
(
name varchar(20),
sex char(2),
age int,
mail varchar(20)
)
insert into studentBackup select name,sex,age,mail from deleted;
delete from student

select * from student
select * from studentBackup

创建instead of触发器

if(object_id('tgr_student_inteadof','tr') is not null)
drop trigger tgr_student_inteadof
go
create trigger tgr_student_inteadof
on student
instead of delete -- update , insert
as
declare @id int,@name varchar(20)
select @id = id,@name = name from deleted;
--instead of 先触发
--先删除user表信息
delete from [user] where userName = @name;
--再删除student表信息
delete from [student] where id = @id; delete from student where name = '海盗船长'

修改触发器

alter trigger tgr_test_insert
on student
for insert
as
print 'ok'

禁用触发器

disable trigger tgr_test_insert on student

启用触发器

enable trigger tgr_test_insert on student

查询已创建的触发器

select * from sys.triggers

 

15、SQL Server 触发器的更多相关文章

  1. sql server触发器的例子

    发布:thebaby   来源:脚本学堂     [大 中 小] 本文介绍下,在sql server数据库中使用触发器的简单例子,有需要的朋友可以参考下,希望对你有一定的帮助. 原文地址:http:/ ...

  2. (转)SQL Server 触发器

    SQL Server 触发器 触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程.触发器主要是通过事件进行触发被自动调用执行的.而存储过程可以通过存储过程的名称被调用. Ø 什么是触发器 ...

  3. 自己写的sql server触发器练练--高手请您跳过吧

    set ANSI_NULLS ONset QUOTED_IDENTIFIER ONgo ALTER TRIGGER [insertReplyToic] ON [dbo].[bbsReplyTopic] ...

  4. sql server 触发器详细应用

    SQL Server 触发器 触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程.触发器主要是通过事件进行触发被自动调用执行的.而存储过程可以通过存储过程的名称被调用.  Ø 什么是触发 ...

  5. SQL server触发器中 update insert delete 分别给写个例子被。

    SQL server触发器中 update insert delete 分别给写个例子以及解释下例子的作用和意思被, 万分感谢!!!! 主要想知道下各个语句的书写规范. INSERT: 表1 (ID, ...

  6. 在Sql Server触发器中判断操作是Insert还是Update还是Delete

    在Sql Server触发器中判断操作是Insert还是Update还是Delete DECLARE    @IsInsert bit,    @IsUpdate bit,    @IsDelete  ...

  7. 喜忧参半的SQL Server触发器

    SQL Server触发器在非常有争议的主题.它们能以较低的成本提供便利,但经常被开发人员.DBA误用,导致性能瓶颈或维护性挑战. 本文简要回顾了触发器,并深入讨论了如何有效地使用触发器,以及何时触发 ...

  8. SQL Server 触发器创建、删除、修改、查看示例

    一﹕ 触发器是一种特殊的存储过程﹐它不能被显式地调用﹐而是在往表中插入记录﹑更新记录或者删除记录时被自动地激活.所以触发器可以用来实现对表实施复杂的完整性约`束. 二﹕ SQL Server为每个触发 ...

  9. SQL Server触发器

    一﹕ 触发器是一种特殊的存储过程﹐它不能被显式地调用﹐而是在往表中插入记录﹑更新记录或者删除记录时被自动地激活.所以触发器可以用来实现对表实施复杂的完整性约`束. 二﹕ SQL Server为每个触发 ...

随机推荐

  1. keil 工程中多文件编译时全局变量怎么引用

    由于代码较多时,为了代码的工整以及易读性,往往将代码拆分成模块,并书写头文件.但keil中定义全局变量往往是一件头疼的事情. (1)xx.h文件中基本书写的是管脚定义和函数声明,全局变量不能定义在头文 ...

  2. 深入剖析Java中的装箱和拆箱(转)

    自动装箱和拆箱问题是Java中一个老生常谈的问题了,今天我们就来一些看一下装箱和拆箱中的若干问题.本文先讲述装箱和拆箱最基本的东西,再来看一下面试笔试中经常遇到的与装箱.拆箱相关的问题. 以下是本文的 ...

  3. error: /lib64/libc.so.6: symbol _dl_starting_up, version GLIBC_PRIVATE not defined in file ld-linux-x86-64.so.2 with link time reference

    ]$ sudo yum install libnotify*Loaded plugins: fastestmirror, refresh-packagekit, securitySetting up ...

  4. 【JS】JS外联不执行,内联执行

    匹配域名http://lb.qq.com 或 http://lb.l.qq.com

  5. ANT的下载和安装

    下载 下载页面:http://ant.apache.org/bindownload.cgi 安装 撰写本文的时候,最新的ANT版本是1.9.7,它是绿色软件,解压缩得到apache-ant-1.9.7 ...

  6. [转载]jQuery UI 使用

    最近项目中使用了一些插件来做页面,这里把jQuery UI的使用分享出来,希望 对新手有帮助.文章结尾附源码下载. 1     jQuery UI 2     为我所用 2.1     Tabs 2. ...

  7. 《A First Course in Probability》-chaper3-条件概率和独立性-P(·|F)是概率

    条件概率中的三个命题: 下面我们分条来解读一下这三个命题.

  8. Django中的CSRF

    CSRF(Cross Site Request Forgery, 跨站域请求伪造) CSRF 背景与介绍 CSRF(Cross Site Request Forgery, 跨站域请求伪造)是一种网络的 ...

  9. nyoj 95 众数问题【水】

    众数问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 所谓众数,就是对于给定的含有N个元素的多重集合,每个元素在S中出现次数最多的成为该元素的重数, 多重集合S重 ...

  10. 365. Water and Jug Problem

    莫名奇妙找了个奇怪的规律. 每次用大的减小的,然后差值和小的再减,减减减减减减到差值=0为止.(较小的数 和 差值 相等为止,这么说更确切) 然后看能不能整除就行了. 有些特殊情况. 看答案是用GCD ...