简介

触发器是一种特殊类型的存储过程。触发器分为:

DML( 数据操纵语言 Data Manipulation Language)触发器:数据库中表或视图的数据更改时触发,包括insert,update,delete语句

DDL(数据定义语言 Data Definition Language)触发器:表或索引中的create、alter、drop语句。

登陆触发器:是指当用户登录SQL SERVER实例建立会话时触发。

 

优劣

可以强制执行业务规则:

Microsoft SQL Server™ 2000 提供了两种主要机制来强制业务规则和数据完整性:约束和触发器。触发器可以强制比用 CHECK 约束定义的约束更为复杂的约束。比

如触发器可通过数据库中的相关表实现级联更改,也可以评估数据修改前后的表状态,并根据其差异采取对策。

以事件方式来处理:当数据发生变化的时候,自动处理

 

缺点

当数据库之间导入导出的时候,可能会引起不必要的触发逻辑

移植性差

触发器只能在当前的数据库中创建,但是可以引用当前数据库的外部对象。

CREATE TRIGGER 必须是批处理中的第一条语句,并且只能应用于一个表。

如果一个表的外键包含对定义的 DELETE/UPDATE 操作的级联,则不能对为表上定义 INSTEAD OF DELETE/UPDATE 触发器。

虽然 TRUNCATE TABLE 语句实际上就是 DELETE 语句,但是它不会激活触发器,因为该操作不记录各个行删除。

 

存贮速度和执行速度:

代码是存储在服务器上, 执行速度主要取决于 数据库服务器的性能与触发器代码的复杂程度。

下面重点说下DML触发器。其它的资料请参考MSDN:
http://msdn.microsoft.com/zh-cn/library/ms189799.aspx

语法

DML触发器语法定义:

CREATE TRIGGER [ schema_name . ]trigger_name

ON { table | view }

[ WITH <dml_trigger_option> [ ,...n ] ]

{ FOR | AFTER | INSTEAD OF }

{ [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] }

[ WITH APPEND ]

[ NOT FOR REPLICATION ]

AS

{ sql_statement [ ; ] [ ,...n ] | EXTERNAL NAME <method specifier [ ; ] > }

DML 触发器使用 deleted 和 inserted 逻辑(概念)表。 它们在结构上类似于定义了触发器的表,即对其尝试执行了用户操作的表。 在 deleted 和 inserted 表保存了可能会被用户更改的行的旧值或新值。获取值可用sql'select * from inserted'.

 

Insert

update

delete

Deleted表

旧值

旧值

Inserted表

新值

新值

 

示例

 

Insert触发器

--判断触发器是否存在

IF (
OBJECT_ID('TR_Class_Create', 'tr')
IS
NOT
NULL
)

DROP
TRIGGER
TR_Class_Create

GO

--创建Create触发器

CREATE
TRIGGER
TR_Class_Create
ON
dbo.Class

FOR
INSERT

AS

--定义变量

DECLARE
@classname_new
NVARCHAR(50);

--获取新的班级名称

SELECT
@classname_new
=
ClassName

FROM
inserted;

--验证是否已存在

IF (
EXISTS
( SELECT *

FROM
dbo.Class

WHERE
ClassName
=@classname_new)
)

BEGIN

RAISERROR('名称已存在',16,1);--抛出一个错误

ROLLBACK
TRAN;--事物回滚

END

GO

--===================================================================

--判断触发器是否存在

IF (
OBJECT_ID('TR_Class_Update', 'tr')
IS
NOT
NULL
)

DROP
TRIGGER
TR_Class_Update

GO

--创建Update触发器

CREATE
TRIGGER
TR_Class_Update
ON
dbo.Class

FOR
UPDATE

AS

--列级别:判断某列是否更新

IF ( UPDATE(ClassName)
)

BEGIN

--定义变量

DECLARE
@classname_new
NVARCHAR(50)
,

@classname_old
NVARCHAR(50);

SELECT
@classname_new
=
ClassName

FROM
inserted;--获取新的班级名称

SELECT
@classname_old
=
ClassName

FROM
deleted;--获取旧的班级名称

--级联更新

UPDATE
dbo.Student

SET
ClassName
=
@classname_new

WHERE
ClassName
=
@classname_old

END

GO

--===================================================================

--判断触发器是否存在

IF (
OBJECT_ID('TR_Class_Delete', 'tr')
IS
NOT
NULL
)

DROP
TRIGGER
TR_Class_Delete

GO

--创建Delete触发器

CREATE
TRIGGER
TR_Class_Delete
ON
dbo.Class

FOR
UPDATE

AS

--备份数据-判断备份表是否存在

IF (
OBJECT_ID('ClassBackup', 'U')
IS
NOT
NULL
)

BEGIN

--数据备份

INSERT
INTO
ClassBackup
SELECT
*
FROM
DELETED;

END

ELSE

--不存在则创建

SELECT
*

INTO
ClassBackup

FROM
DELETED;

 

GO

 

--===================================================================

--触发器查询

--查询数据库所有触发器

select
*
from
sysobjects
where
xtype='TR'

select
*
from
sys.triggers;

--查看触发器触发事件

select
te.*
from
sys.trigger_events
te join sys.triggers
t

on
t.object_id = te.object_id

where
t.parent_class = 1 and t.name =
'TR_Class_Create';

--查看单个触发器

exec
sp_helptext
'TR_Class_Create'

--禁用触发器

disable
trigger
TR_Class_Create
on
student;

--启用触发器

enable
trigger
TR_Class_Create
on
student;

--删除触发器

drop
trigger
TR_Class_Create

 

结束语

触发器偶尔用用还是能解决大问题的,使实现更简洁。初步学习,如有错误,欢迎指正。

SQL触发器学习的更多相关文章

  1. SQL触发器实例

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

  2. 触发器学习笔记(:new,:old用法)

    触发器学习笔记(:new,:old用法) 触发器是数据库发生某个操作时自动运行的一类的程序         用于保持数据的完整性或记录数据库操作信息方面         触发器不能够被直接调用,只能够 ...

  3. SQL Sever 学习系列之一

    SQL Sever 学习系列之一 本学习系列,从实际工作需要中积累,对于一个新手而言,写出几条漂亮的查询语句,应该是可以受启发的. 一.问题的需求是:员工薪酬发放,现有资金能发放多少人,哪些人应得? ...

  4. 【SQL Server学习笔记】Delete 语句、Output 子句、Merge语句

    原文:[SQL Server学习笔记]Delete 语句.Output 子句.Merge语句 DELETE语句 --建表 select * into distribution from sys.obj ...

  5. 【牛腩视频】之SQL触发器 标签: 数据库 2015-05-23 09:44 1339人阅读 评论(40) 收藏

    之前在学习机房管理系统.net版的时候,已经写过了关于数据库的操作,但是现在开始学习牛腩,才发现之前自己理解的太浅显,很多东西看似好像会了,不去实际操作一下,不把代码从头到尾敲出来,到头来还是不会,所 ...

  6. SQL server学习

    慕课网sql server学习 数据库第一印象:desktop--web server--database server** 几大数据库:sql server.oracle database.DB2. ...

  7. SQL语句学习手册实例版

    SQL语句学习手册实例版 表操作 例1  对于表的教学管理数据库中的表 STUDENTS ,可以定义如下: CREATE  TABLE  STUDENTS (SNO      NUMERIC (6, ...

  8. SQL触发器实例讲解

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

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

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

随机推荐

  1. Linux里如何设置IP(RED HAT)

    一共包括以下两步 1:通过setup命令设置IP 保存…… --如果‘Use DHCP'处事[*],则可能无法手动输入IP,子网掩码和网关. 解决办法: 修改脚本/etc/sysconfig/netw ...

  2. Blogger支持Mobile行动版网页 - Blog透视镜

    目前几乎人人都使用行动装置像是Pad,智能型手机等,而Blogger也针对此类的使用者,推出支持Mobile行动版网页,提供简单清爽的页面,方便在小屏幕上的阅读,在设定上也相当的简单,同时还可以在计算 ...

  3. 使用片上XRAM需要进行的初始化

    现在,流行的51单片机大多把on-chip expanded RAM(以下简称XRAM)作为基本配置,容量有些差别.厂商在给出芯片特性时,往往把XRAM和标准52芯片的256字节内部RAM加在一起统称 ...

  4. logstash 字段类型转换后 需要刷新

    filter { grok { match => [ "message" , "\s*%{IPORHOST:clientip}\s+\-\s+\-\s+\[%{HT ...

  5. 提高效率的便签By番茄时间管理 win7标签,小功能,大作用

    今日待办 把一些重要的事情,列入其中. 着重处理. 活动清单 罗列一些最近需要做的事情,不一定按照紧急重要的程度. 把活动清单中的事情,按照实际情况,安排到今日待办当中. 还有一个我喜欢的'头脑风暴' ...

  6. 2013第49周一jsp标签

    2013第49周一jsp标签 今天在调试一些前台页面上的问题,在处理structs标签.jstl标签时遇到了些麻烦,为了调用后台数据字典中的类方法,开始在<c:forEach>中尝试怎么样 ...

  7. /proc/uptime

    在Linux中,我们常常会使用到uptime命令去看看系统的运行时间,它与一个文件有关,就是/proc/uptime.这个文件里的两个参数所代表的意义如下. [root@app ~]#cat /pro ...

  8. 一个跨域请求的XSS漏洞

    场景回顾 一个表单进行跨域提交的方式有很多,我们使用的采用隐藏iframe,在本域下放一个代理页面,通过服务端配合完成一次完整的请求. 首先,部署proxy.html代理页面.这个页面处理服务端返回的 ...

  9. Android核心基础(十)

    1.音频采集 你可以使用手机进行现场录音,实现步骤如下: 第一步:在功能清单文件AndroidManifest.xml中添加音频刻录权限: <uses-permission android:na ...

  10. 学习javascript基础知识系列第三节 - ()()用法

    总目录:通过一段代码学习javascript基础知识系列 注意: 为了便于执行和演示,建议使用chrome浏览器,按F12,然后按Esc(或手动选择)打开console,在console进行执行和演示 ...