SQL触发器学习
简介
触发器是一种特殊类型的存储过程。触发器分为:
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触发器学习的更多相关文章
- SQL触发器实例
SQL触发器实例讲解(本文是来自百度文库) 备注:本人建了一个站特价汇,我想记录每个商品的点击量,然后按照点击量来牌名商品,想要提高效率,所以必须得用触发器,下面是本人在百度文库中的找到的学习资料,分 ...
- 触发器学习笔记(:new,:old用法)
触发器学习笔记(:new,:old用法) 触发器是数据库发生某个操作时自动运行的一类的程序 用于保持数据的完整性或记录数据库操作信息方面 触发器不能够被直接调用,只能够 ...
- SQL Sever 学习系列之一
SQL Sever 学习系列之一 本学习系列,从实际工作需要中积累,对于一个新手而言,写出几条漂亮的查询语句,应该是可以受启发的. 一.问题的需求是:员工薪酬发放,现有资金能发放多少人,哪些人应得? ...
- 【SQL Server学习笔记】Delete 语句、Output 子句、Merge语句
原文:[SQL Server学习笔记]Delete 语句.Output 子句.Merge语句 DELETE语句 --建表 select * into distribution from sys.obj ...
- 【牛腩视频】之SQL触发器 标签: 数据库 2015-05-23 09:44 1339人阅读 评论(40) 收藏
之前在学习机房管理系统.net版的时候,已经写过了关于数据库的操作,但是现在开始学习牛腩,才发现之前自己理解的太浅显,很多东西看似好像会了,不去实际操作一下,不把代码从头到尾敲出来,到头来还是不会,所 ...
- SQL server学习
慕课网sql server学习 数据库第一印象:desktop--web server--database server** 几大数据库:sql server.oracle database.DB2. ...
- SQL语句学习手册实例版
SQL语句学习手册实例版 表操作 例1 对于表的教学管理数据库中的表 STUDENTS ,可以定义如下: CREATE TABLE STUDENTS (SNO NUMERIC (6, ...
- SQL触发器实例讲解
SQL触发器实例1 定义: 何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序.触发器是一个特殊的存储过程. 常见的触发器有三种:分别应用于Inser ...
- SQL触发器中的deleted表和inserted表
SQL触发器中的deleted表和inserted表 在触发器语句中用两个特殊的表一个是deleted表和inserted.它们是通过触发器操作自动创建驻留在内存中的临时表. 描述: Deleted表 ...
随机推荐
- 利用Azure高级存储搭建高性能Linux服务器(1)
目前Azure针对虚拟机提供两种类型的存储,一种是标准存储,基于HDD的,一种是高性能存储Premium Storage(在下文中简称PS),基于SSD的.针对用户高性能,低延迟,I/O密集型的应用, ...
- MySQL导入较大sql文件报错max_allowed_packet
1.查看当前最大允许导入sql文件大小 show VARIABLES like '%max_allowed_packet%'; 2.修改方式 1.永久生效 修改my.cnf文件 vim /etc/my ...
- Blogger支持Mobile行动版网页 - Blog透视镜
目前几乎人人都使用行动装置像是Pad,智能型手机等,而Blogger也针对此类的使用者,推出支持Mobile行动版网页,提供简单清爽的页面,方便在小屏幕上的阅读,在设定上也相当的简单,同时还可以在计算 ...
- keil C 应注意的几个问题
我们使用Keil C调试某系统时积累的一些经验 1.在Windows2000下面,我们可以把字体设置为Courier,这样就可以显示正常.2.当使用有片外内存的MCU(如W77E58,它有1K片外内存 ...
- 《Programming WPF》翻译 第3章 1.什么是控件
原文:<Programming WPF>翻译 第3章 1.什么是控件 对于一个应用程序而言,控件是搭建用户界面的积木.它们具备交互式的特征,例如文本框.按钮以及列表框.尽管如此,WPF还有 ...
- Transposed Matrix
Transposed Matrix In linear algebra, the transpose of a matrix A is another matrix AT (also written ...
- UML--核心元素之分析类
分析类包括边界类.控制类和实体类. 边界类是一种用于对系统外部环境与其内部运作之间的交互进行建模的类. myself:就像建模时,不是所有的属性都要建模一样.不是所有的方法都要建模一样.学习也是如此, ...
- unix c 08
信号 - signal()改变信号的处理方式.默认情况下,信号在Unix中都有自己的处理方式,如果想改变信号的处理方式,signal/sigaction 可以实现. 信号可以在关键代码处进行屏蔽,因为 ...
- UITextField实现过滤选中状态拼音
先提供下简书地址, 排版更好. 我的简书地址: http://www.jianshu.com/p/80e79c6d1511 UITextField相信很多的iOS开发者都会经常用到, 最近项目中遇到了 ...
- 《Two Days DIV + CSS》读书笔记——CSS控制页面方式
1.1 你必须知道的知识 (其中包括1.1.1 DIV + CSS的叫法解释:1.1.2 DIV + CSS 名字的误区:以及1.1.3 W3C简介.由于只是背景知识,跳过该章.) 1.2 你必须掌握 ...