【触发器】数据库_触发器实例
数据库触发器案例
一、课堂演示案例
例一:创建一个简单的insert触发器
先创建一个数据库备用
create database sampledb
go
use sampledb
go
在新创建的库中创建一个表备用
create table aa
(
a int,
b int
)
go
在新创建的表上创建一个insert触发器
use sampledb
go
if exists(select name from sysobjects where name ='tr_intoa' and type='tr')
drop trigger tr_intoa
go
create trigger tr_intoa on aa
for insert
as
print 'success inserted one row!'
查看这个触发器的定义文本
sp_helptext checkpubdate
查看这个触发器的信息
sp_help checkpubdate
验证这个触发器的工作情况
insert into aa values (1,2)
----------------------------------------------------------------------------------------------------------------------
例二:创建一个触发器监视insert操作,若插入的记录中版权费超过30,则提示用户,并回滚此操作。
use pubs
go
if exists(select name from sysobjects where name ='CheckRoyalty' and type='tr')
drop trigger CheckRoyalty
go
create trigger checkroyalty
on roysched
for insert as
if (select royalty from inserted) > 30
begin
print 'royaltytrigger:版权费不能超过 30'
print '请将版权费修改为小于 30 的值'
rollback transaction
end
insert into roysched values ('BU1032',2,5,90)
select * from roysched where title_id='BU1032'
----------------------------------------------------------------------------------------------------------------------
例三:创建一个触发器监视insert操作,若插入的记录中出版日期小于当前日期,则提示用户,并回滚此操作。
use pubs
go
if exists(select name from sysobjects where name ='checkpubdate' and type='tr')
drop trigger checkpubdate
go
create trigger checkpubdate
on titles
for insert as
if (select pubdate from inserted) < getdate()
begin
select * from inserted --查看内存表中的数据
print '出版日期小于当前日期'
rollback transaction
end
触发器示例测试
insert into titles(title_id,title,type,pubdate)
values('SW0001','test book','business','1990-1-1')
select * from inserted
----------------------------------------------------------------------------------------------------------------------
例四:列级update触发器示例
use pubs
go
if exists(select name from sysobjects where name ='NoUpdatePayterms' and type='tr')
drop trigger NoUpdatePayterms
go
CREATE TRIGGER NoUpdatePayterms
ON sales
FOR UPDATE AS
IF UPDATE (payterms)
BEGIN
PRINT '不能修改订单的付费条款'
ROLLBACK TRANSACTION
END
测试触发器的工作情况
update sales set qty=8
where stor_id='6380' and
ord_num='6871' and
title_id='BU1032'
update sales set payterms='aa'
where stor_id='6380' and
ord_num='6871' and
title_id='BU1032'
----------------------------------------------------------------------------------------------------------------------
例五:表级update触发器实例
use pubs
go
if exists(select name from sysobjects where name ='NoUpdateDiscount' and type='tr')
drop trigger NoUpdateDiscount
go
create trigger NoUpdateDiscount
on discounts
for update as
if (select discount from inserted) > 12
begin
select * from inserted --查看内存表中的数据
select * from deleted --查看内存表中的数据
print '不能指定大于 12% 的折扣'
rollback transaction
end
表级 UPDATE 触发器测试
update discounts
set discount = 20
where stor_id = '8042'
----------------------------------------------------------------------------------------------------------------------
例六:列级update 触发器示例
use northwind
go
建立登记修改人帐号的表
create table who_change
(
change_date datetime,
change_column varchar(50),
who varchar(50)
)
go
建立触发器
use northwind
go
if exists(select name from sysobjects where name ='tr_orderdetail_insupd' and type='tr')
drop trigger tr_orderdetail_insupd
go
create trigger tr_orderdetail_insupd
on
[order details]
for update
as
if update (unitprice)
begin
insert who_change
values (getdate(),'unitprice updated',user_name())
end
else if update (Quantity)
begin
insert who_change values(getdate(),'quantity updated',user_name())
end
else if update(discount)
begin
insert who_change values (getdate(),'discount updated',user_name())
end
go
测试触发器的工作情况
update [order details] set unitprice=2 where orderid=10248 and productid=1
update [order details] set Quantity=4 where orderid=10248 and productid=1
update [order details] set discount=0 where orderid=10248 and productid=1
----------------------------------------------------------------------------------------------------------------------
例七:触发器只能在当前数据库中创建。 但是,触发器可以引用其他数据库中的对象。(示例)
use sampledb
go
创建表test备用
create table test
(
aa int,
bb int
)
go
向test表中插入一些数据备用
insert into test values (1001,0)
insert into test values (1002,0)
insert into test values (1003,0)
创建另一个库备用
create database testdb
go
use testdb
go
在库testdb中再创建一个表备用
create table test_11
(
aa int,
bb int
)
go
在testdb库中的表test_11上创建一个insert触发器
use testdb
go
if exists(select name from sysobjects where name ='tri_test' and type='tr')
drop trigger tri_test
go
create trigger tri_test on test_11
for insert
as
update sampledb.dbo.test
set bb=bb+(select bb from inserted)
where aa= (select aa from inserted)
测试触发器的工作情况
insert into test_11 values (1002,2)
insert into test_11 values (1001,1)
----------------------------------------------------------------------------------------------------------------------
例八:DELETE 触发器示例
use testdb
go
if exists(select name from sysobjects where name ='NoDelete9901' and type='tr')
drop trigger NoDelete9901
go
create trigger NoDelete9901
on pub_info
for delete AS
if (select pub_id from deleted) = '9901'
begin
print '不能删除出版商 9901 的详细信息'
rollback transaction
end
DELETE 触发器示例测试
delete pub_info
where pub_id = '9901'
----------------------------------------------------------------------------------------------------------------------
例九:视图上的 INSTEAD OF 触发器示例
use pubs
go
select * into bak_employee from employee
select * into bak_publishers from publishers
create view Emp_pub
as
select emp_id, lname, job_id, pub_name
from bak_employee e, bak_publishers p
where e.pub_id = p.pub_id
create trigger del_emp
on Emp_pub
instead of delete
as
select * from deleted --查看内存表中的数据
delete bak_publishers
where emp_id in
(select emp_id from deleted)
视图上的 INSTEAD OF 触发器示例测试
delete Emp_pub
----------------------------------------------------------------------------------------------------------------------
例十:表上的INSTEAD OF 触发器示例
use pubs
go
if exists(select name from sysobjects where name ='tri_deltitle' and type='tr')
drop trigger tri_deltitle
go
create trigger tri_deltitle on titles
instead of delete
as
print '不允许删除!'
delete from titles where title_id='BU1032'
----------------------------------------------------------------------------------------------------------------------
例十一:禁用触发器嵌套
exec sp_configure 'nested trigger', 0
例十二:启用触发器嵌套
exec sp_configure 'nested trigger', 1
----------------------------------------------------------------------------------------------------------------------
例十三:触发器嵌套示例
use sampledb
go
建立触发器
create table testa
(
a_id char(1),
a_name char(2)
)
insert into testa values('1','1')
insert into testa values('2','2')
insert into testa values('3','3')
create table testb
(
b_id char(1),
b_name char(2)
)
insert into testb values('1','1')
insert into testb values('2','2')
insert into testb values('3','3')
create table testc
(
c_id char(1),
c_name char(2)
)
insert into testc values('1','1')
insert into testc values('2','2')
insert into testc values('3','3')
触发器嵌套示例(1)
create trigger del_testa
on testa
instead of delete
as
delete testb
where b_id in
(select a_id from deleted)
create trigger del_testb
on testb
instead of delete
as
delete testc
where c_id in
(select b_id from deleted)
触发器嵌套示例测试(1)
delete testa where a_id = '1'
-- drop trigger del_testa2
-- drop trigger del_testb2
----------------------------------------------------------------------------------------------------------------------
触发器嵌套示例(2)
create trigger del_testa2
on testa
for delete
as
delete testb
where b_id in
(select a_id from deleted)
create trigger del_testb2
on testb
for delete
as
delete testc
where c_id in
(select b_id from deleted)
触发器嵌套示例测试(1)
delete testa where a_id = '1'
----------------------------------------------------------------------------------------------------------------------
例十四:触发器综合应用
创建触发器
use northwind
if exists(select name from sysobjects where name ='tr_product_update' and type='tr')
drop trigger tr_product_update
go
use northwind
go
create trigger tr_product_update on products
for update
as
declare @msg varchar(100)
select @msg = str(@@rowcount)+'employees updated by this statement'
print @msg
return
go
管理触发器
use northwind
go
sp_helptrigger products,delete
inerted和deleted表实现级联修改多数据表的触发器
use northwind
go
create trigger tr_suppliers_del
on suppliers
for delete
as
if @@rowcount=0
return
delete products from deleted d,suppliers s
where d.supplierid=s.supplierid
if @@error != 0
begin
rollback tran
return
end
return
go
----------------------------------------------------------------------------------------------------------------------
例十五:列级触发器应用
列级触发器 在通常情况下,用户对表所作的修改都只局限在表中的某些列上,而且,用户经常需要判断在某些列上的数据是否发生了修改,并在数据被修改时作出相应的反应。这种形式的触发器,被称为列级触发器。列级触发器主要
针对某些列实施监控。
use northwind
go
建立登记修改人帐号的表
create table who_change
(
change_date datetime,
change_column varchar(50),
who varchar(50)
)
go
建立触发器
create trigger tr_orderdetail_insupd
on
[order details]
for insert,uodate
as
if update (unitprice)
begin
insert who_change
values (getdate(),'unitprice updated',user_name())
end
else if update (Quantity)
begin
insert who_change values(getdate(),'quantity updated',user_name())
end
else if update(discount)
begin
insert who_change values (getdate(),'discount updated',user_name())
end
go
欢迎关注公众号:
【触发器】数据库_触发器实例相关推荐
- 数据库_触发器和事件
本文所使用的数据库样例请参见数据源表 1.触发器 触发器是程序员设定的在特定条件下将会执行的语句集合 1.1 创建触发器语法 delimiter 99 create trigger trigger_n ...
- mysql利用触发器删除数据库_[数据库]mysql 触发器的创建 修改 删除
[数据库]mysql 触发器的创建 修改 删除 0 2015-12-16 23:00:04 //做一个简单的练习,创建一个简单的触发器 完成添加文章的时候,自动加上时间,默认作者 为 '日记本的回忆' ...
- 触发器和java的关系_触发器-1 - java ee spring - 博客园
------------------------------------环境代码 create table student (stuid varchar2(10) not null, stuname ...
- oracle 触发器用法,Oracle触发器用法实例详解
本文实例讲述了Oracle触发器用法.分享给大家供大家参考,具体如下: 一.触发器简介 触发器的定义就是说某个条件成立的时候,触发器里面所定义的语句就会被自动的执行. 因此触发器不需要人为的去调用,也 ...
- 多字段mysql触发器实例_mysql触发器原理与用法实例分析
本文实例讲述了mysql触发器原理与用法.分享给大家供大家参考,具体如下: 本文内容: 什么是触发器 创建触发器 单条触发器语句 多条触发器语句 查看触发器 删除触发器 触发器的新旧记录引用 首发日期 ...
- mysql int 默认值 为ull_mysql的 约束 数据库设计 数据库 存储 触发器 mysql 权限问题...
今天的目标: mysql的 约束 数据库设计 数据库 存储 触发器 mysql 权限问题 先讲约束: 要他唯一 不能重复 不能空值 : 什么是 mysql的约束: 对mysql 进行约束 2.2 默 ...
- Oracle入门(十四.22)之创建DDL和数据库事件触发器
一.什么是DDL和数据库事件触发器? DDL语句触发DDL触发器:CREATE,ALTER或DROP. 数据库事件触发器由数据库中的非SQL事件触发,例如: •用户连接到数据库或与数据库断开连接. • ...
- 浅谈SQL Server 数据库的触发器
浅谈SQL Server 数据库的触发器 触发器的特征: 1.触发器是在对表进行增.删.改时,自动执行的存储过程.触发器常用于强制业务规则,它是一种高级约束,通过事件进行触发而被执行. 2.触发器 ...
- pl/sql操作数据库之触发器的使用
pl/sql操作数据库之触发器的使用 这篇文章讲述的是pl/sql操作数据库之触发器的使用,如有错误或不当之处,还望各位大神批评指正. 什么是触发器? 触发器是许多关系数据库系统都提供的一项技术.在O ...
- MySql简单入门_第四篇 高级使用(4)_触发器
4.触发器TRIGGER : 在某个表发生某一事件时,自动来触发某个操作. 触发器是MySql响应INSERT语句,UPDATE语句和 DELETE 语句而自动执行的一条MySql语句(或位于BEGI ...
最新文章
- VS 打开No EditorOptionDefinition export found for the given option name问题解决
- 在web.xml文件中配置Servlet时,主要配置哪些信息?
- 51CTO学院三周年,一起成长与奋斗的日子
- 小忆《记录博客一周年》
- 操作系统各大公司笔试题汇总
- EA与Rose UML建模工具比较
- 数据可视化【十】绘制地图
- vc++6.0 模拟鼠标点击代码 木马程序的编写 VC 模拟键盘输入
- 将ocx和DLL文件打包成cab文件,inf的编写
- docker中使用postgresql
- oracle空值减去一个数_Oracle 空值(null)有关的函数
- Python 机器学习:多元线性回归
- 趣头条将获得阿里1.71亿美元的可转债,为期三年
- python django做网页论文_Python Web程序-Django框架搭建网站的简单介绍
- vue 固定div 滚动_Vue - 让水平滚动条(scroll bar)固定在浏览器的底部
- vector的初始化和使用
- X Chen笔记---百度云破解限速
- 华为新机亮剑鸿蒙系统,华为亮剑,超级环绕屏+麒麟9000+鸿蒙系统,欣喜油然而生...
- 迈阿密牛津计算机专业,迈阿密大学牛津分校计算机科学
- 最全IDC数据中心知识讲解(一)
热门文章
- 简单的Qt倒计时程序--番茄钟
- 【STM32H7教程】第39章 STM32H7的DMAMUX基础知识(重要)
- APP自动化测试--IOS
- Python_072205_创建一个类方法记录车的品牌mark、颜色color、价格price、速度speed等特征, 并实现增加车辆信息、显示车辆全部信息的功能。
- Visual Studio 2008破解激活升级方法【转】
- 20200726 plecs 元件显示变量名
- C语言基础程序题及答案(适合学完C基础的人练练手)
- 工作量统计系统 python_软件测试工作量统计新方法
- win7 桌面计算机不显示器,Win7电脑显示器黑屏不显示的解决方案
- 对抗网络学习-FGSM对抗样本生成