SQL触发器笔记
触发器(Trigger)是在对表进行插入、更新、删除等操作时自动执行的存储过程。
触发器是一种特殊的存储过程,它在执行语言事件时自动生效,采用事件驱动机制。当某个触发事件发生时,定义在触发器中的功能将被DBMS自动执行。
触发器可以用于SQL Server约束、默认值和规则的完整性检查,还可以完成难以用普通约束实现的复杂功能。
当一个触发器建立后,它作为一个数据库对象被存储。
触发器支持哪些功能?
在触发事件执行之后被触发,方可完成事件本身的功能
可以引用事件中对于行修改前后的值
对于UPDATE事件可以定义对哪个表、或表中的哪一列被修改时,触发器被触发
可以用WHEN子句来指定执行条件
可以完成一些复杂的数据检查
触发器有哪些优点?
能够实现更复杂的数据完整性检验
和约束相比,触发器更灵活
对表的任何修改,触发器都能被激活,对数据实施完整性检查
存储过程与触发器有何区别?
触发器与普通存储过程的不同之处在于:触发器的执行是由事件触发的,而普通存储过程是由命令调用执行的。
存储过程必须由用户、应用程序或者触发器来显示的调用并执行。
触发器是一种特殊类型的存储过程,它在指定的表中数据发生变化时自动生效。
触发器是当特定时间出现的时候,自动执行或者激活的,与连接用数据库中的用户、或者应用程序无关。当一行被插入、更新或者删除时触发器才执行,同时还取决于触发器是怎样创建的,
当UPDATE发生时使用一个更新触发器,当INSERT发生时使用一个插入触发器,当DELETE发生时使用一个删除触发器。
小结
触发器是一种特殊类型的存储过程,它在指定的表中数据发生变化时自动生效。
触发器与普通存储过程的不同之处在于:触发器的执行是由事件触发的,而普通存储过程是由命令调用执行的。
触发器的类型
(1)DML触发器
AFTER触发器:在执行了插入、修改、删除之后执行的触发器,指定after和指定for是相同的,for存在于早期版本,SqlServer2005之后的版本就大都使用after触发器。
INSTEAD OF触发器:执行instead of 操作,代替引发触发器的数据库操作。
(2)DDL触发器:针对数据定义语言来进行触发的,可用于数据库中执行管理任务,比如说审核以及规范数据库操作。
DML与DDL之间有什么区别:
从简单意义上讲,
DML触发器是针对插入、修改、删除操作进行的触发。
DDL是针对create、alter、drop等数据库定义语言的时候进行的触发;目的是禁止对数据库结构的修改;当修改数据库结构时执行一些特定的操作;记录对数据库结构的修改。
触发器所影响的表
(1)inserted表
用于存储INSERT和UPDATE语句所影响的行 的最终数据副本。
在一个插入或更新事务处理中,新建行被同时添加到inserted表和触发器表中。
inserted表中的行是触发器表中新行的副本。
(2)deleted表
用于存储DELETE和UPDATE语句所影响的行的复本。
在执行DELETE或UPDATE语句时,行从触发器表中删除,并传输到deleted表中。
deleted表和触发器表通常没有相同的行。
临时表:SQL server 2005会自动创建和管理,表结构和被操作的表结构一致
inserted表和deleted表存放的信息如下表:

当创建一个触发器时必须指定如下选项:
(1)名称;
(2)在其上定义触发器的表;
(3)触发器将何时激发;
(4)激活触发器的数据修改语句,有效选项为 INSERT、UPDATE 或 DELETE,多个数据修改语句可激活同一个触发器;
(5)执行触发操作的编程语句。
创建一个触发器,当对student表里面的学号数据进行插入或者更新时,要检查该数据是否五位数,如果不是,则此次操作取消
use stu
go
create trigger trigger_1
on student
for insert,update
as
declare @sno varchar(10)
set @sno=(select sno from inserted)
if(len(@sno)!=5)
rollback
创建一个触发器,不允许在本服务器上删除任何数据库
create trigger database_delete
on all server
for drop_database
as
rollback
创建触发器,完成功能:禁止在数据库中对表的所有DDL操作。(慎用)
create trigger tr_all_no
on database
for create_table,alter_table,drop_table
as
rollback
创建触发器,禁止对Student表中的Sname,Sage进行更新。
CREATE TRIGGER trig_update_ Student
ON Student
FOR UPDATE
AS
if (update(Sname)or update(Sage))
begin
RAISERROR ('安全警告:该信息不能修改',16,1)
print '事务不能被处理,基本数据不能修改!'
rollback transaction
end
创建一个触发器(Trigger_学生性别),用以约束学生表中性别字段值(只可能是“男”或“女”),保证数据的正确性。
CREATE TRIGGER Trigger_学生性别 ON student
FOR INSERT
AS
IF EXISTS(SELECT * FROM student WHERE sgender NOT IN ('男','女'))
BEGIN
RAISERROR('请输入合法的性别!',16,1)
ROLLBACK TRANSACTION
END
删除一个已有的触发器(Trigger_学生)
IF EXISTS(SELECT name FROM sysobjects
WHERE name = 'Trigger_学生性别' and type='TR')
DROP TRIGGER Trigger_学生性别
使用T-SQL脚本删除触发器
语法:
--声明数据库引用
use 数据库;
go
--判断是否存在,如果存在则删除
if exists(select * from sys.triggers where name=触发器名)
--删除DML触发器
drop trigger 触发器名;
----删除DDL触发器
--drop trigger 触发器名 on database;
--删除登录触发器
--drop trigger 触发器名 on all server;
SQL触发器笔记的更多相关文章
- SQL触发器实例讲解
SQL触发器实例1 定义: 何为触发器?在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序.触发器是一个特殊的存储过程. 常见的触发器有三种:分别应用于Inser ...
- SQL触发器实例
SQL触发器实例讲解(本文是来自百度文库) 备注:本人建了一个站特价汇,我想记录每个商品的点击量,然后按照点击量来牌名商品,想要提高效率,所以必须得用触发器,下面是本人在百度文库中的找到的学习资料,分 ...
- SQL触发器中的deleted表和inserted表
SQL触发器中的deleted表和inserted表 在触发器语句中用两个特殊的表一个是deleted表和inserted.它们是通过触发器操作自动创建驻留在内存中的临时表. 描述: Deleted表 ...
- SQL 触发器(学生,课程表,选修表)
SQL 触发器(学生,课程表,选修表) 触发器是一种特殊类型的存储过程,它不由用户通过命令来执行,而是在用户对表执行了插入,删除或修改表中数据等操作时激活执行.可以这样形容:存储过程像一个遥控炸弹,我 ...
- Oracle数据库之PL/SQL触发器
Oracle数据库之PL/SQL触发器 1. 介绍 触发器(trigger)是数据库提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是 ...
- PB+MS SQL+触发器必须指出
PB+MS SQL+触发器必须指出: 若触发器存在两笔以上的返回值,比方两条update 语句,被误判为数据有改变.存盘不成功. 提示: Row changed between retrieve an ...
- ORALCE PL/SQL学习笔记
ORALCE PL/SQL学习笔记 详情见自己电脑的备份数据资料
- SQL触发器实例(下)
基本语法: Create Trigger [TriggerName] ON [TableName] FOR [Insert][,Delete][,Update] AS --触发器要执行的操作语句. G ...
- SQL 触发器-如何查看当前数据库中有哪些触发器
在查询分析器中运行: use 数据库名goselect * from sysobjects where xtype='TR' sysobjects 保存着数据库的对象,其中 xtype 为 TR 的记 ...
随机推荐
- HDU - 1200 To and Fro
题意:给定一个,其实是由一个图按蛇形输出而成的字符串,要求按从左到右,从上到下的顺序输出这个图. 分析: 1.把字符串转化成图 2.按要求输出图= = #include<cstdio> # ...
- javascript 解决provisional headers are shown的过程
请求没有被发送,因为是载入缓存资源. 大概是说 完全相同的请求间隔数毫秒(太短),导致加载失败,查看了chrome控制台发现 Provisional headers are shown 出现在 载入缓 ...
- 计划任务常用在线工具-微服务信息整-seafile网盘-亿图操作-正则工具
正则工具 https://regex101.com/ http://www.regexp.cn/Regex 身份证匹配 ^(\\d{}|\d{})(\\d|[xX])$ \d{}[-9Xx]|\d{} ...
- openstack trove weekly meeting时间即将更改
为了平衡英国.巴黎.德国.美国和中国开发者的作息习惯,openstack trove项目组在5月18日的weekly meeting上开始讨论新的开会时间. 当前的开会时间是,周三 UTC 18:00 ...
- Ubuntu Kylin 14.04LTS 开机后卡在登陆界面,可以进入字符界面,或者登陆后鼠标不显示但是管用
2014年4月27日,距离中期检查还有七天,基本上什么也没做,特别着急,雨已经下了快一天了,中午用美团外卖定的黄焖排骨,MD,什么玩意,那么一点点就18块钱,一看就不值五块钱,发誓再也不吃,最重要的是 ...
- Ubuntu无法锁定管理目录(/var/lib/dpkg/),是否有其他进程正占用它?
转自:http://hi.baidu.com/xiaobaishu 鸣谢: xuleibjtu2010的原创空间 1.终端输入 ps -aux ,列出进程.找到含有apt‘-get的进程,直接sud ...
- 通过Android的API对Sqlite数据库进行操作
一.增删改查 增 改 查 删 这是删除之前 删除三条 Dao.java package com.example.databasedemo; import android.content.Content ...
- 对CI框架中几个文件libraries
对CI框架中几个文件libraries,helpers,hooks夹说明 来源:未知 时间:2014-10-20 11:37 阅读数:117 作者:xbdadmin [导读] 1.lib ...
- UVALive 3983 捡垃圾的机器人 DP
这个题目我最初的做法沿用树形DP的做法,设置一个 dp[i][0]表示机器人在i点不回去的最短路径,dp[i][1]表示机器人在i点回去的最短路径,规划方向为i-1向i转移,结果发现这个不能用树形的结 ...
- 信号分析——从傅里叶变化到FFT
我们眼中的世界就像皮影戏的大幕布,幕布的后面有无数的齿轮,大齿轮带动小齿轮,小齿轮再带动更小的. 在最外面的小齿轮上有一个小人——那就是我们自己. 我们只看到这个小人毫无规律的在幕布前表演,却无法预测 ...