数据库触发器案例

一、课堂演示案例

例一:创建一个简单的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.1 创建触发器语法 delimiter 99 create trigger trigger_n ...

  2. mysql利用触发器删除数据库_[数据库]mysql 触发器的创建 修改 删除

    [数据库]mysql 触发器的创建 修改 删除 0 2015-12-16 23:00:04 //做一个简单的练习,创建一个简单的触发器 完成添加文章的时候,自动加上时间,默认作者 为 '日记本的回忆' ...

  3. 触发器和java的关系_触发器-1 - java ee spring - 博客园

    ------------------------------------环境代码 create  table student (stuid varchar2(10) not null, stuname ...

  4. oracle 触发器用法,Oracle触发器用法实例详解

    本文实例讲述了Oracle触发器用法.分享给大家供大家参考,具体如下: 一.触发器简介 触发器的定义就是说某个条件成立的时候,触发器里面所定义的语句就会被自动的执行. 因此触发器不需要人为的去调用,也 ...

  5. 多字段mysql触发器实例_mysql触发器原理与用法实例分析

    本文实例讲述了mysql触发器原理与用法.分享给大家供大家参考,具体如下: 本文内容: 什么是触发器 创建触发器 单条触发器语句 多条触发器语句 查看触发器 删除触发器 触发器的新旧记录引用 首发日期 ...

  6. mysql int 默认值 为ull_mysql的 约束 数据库设计 数据库 存储 触发器 mysql 权限问题...

    今天的目标: mysql的 约束 数据库设计 数据库 存储 触发器 mysql 权限问题 先讲约束: 要他唯一 不能重复 不能空值 : 什么是 mysql的约束: 对mysql 进行约束 2.2  默 ...

  7. Oracle入门(十四.22)之创建DDL和数据库事件触发器

    一.什么是DDL和数据库事件触发器? DDL语句触发DDL触发器:CREATE,ALTER或DROP. 数据库事件触发器由数据库中的非SQL事件触发,例如: •用户连接到数据库或与数据库断开连接. • ...

  8. 浅谈SQL Server 数据库的触发器

    浅谈SQL Server 数据库的触发器   触发器的特征: 1.触发器是在对表进行增.删.改时,自动执行的存储过程.触发器常用于强制业务规则,它是一种高级约束,通过事件进行触发而被执行. 2.触发器 ...

  9. pl/sql操作数据库之触发器的使用

    pl/sql操作数据库之触发器的使用 这篇文章讲述的是pl/sql操作数据库之触发器的使用,如有错误或不当之处,还望各位大神批评指正. 什么是触发器? 触发器是许多关系数据库系统都提供的一项技术.在O ...

  10. MySql简单入门_第四篇 高级使用(4)_触发器

    4.触发器TRIGGER : 在某个表发生某一事件时,自动来触发某个操作. 触发器是MySql响应INSERT语句,UPDATE语句和 DELETE 语句而自动执行的一条MySql语句(或位于BEGI ...

最新文章

  1. VS 打开No EditorOptionDefinition export found for the given option name问题解决
  2. 在web.xml文件中配置Servlet时,主要配置哪些信息?
  3. 51CTO学院三周年,一起成长与奋斗的日子
  4. 小忆《记录博客一周年》
  5. 操作系统各大公司笔试题汇总
  6. EA与Rose UML建模工具比较
  7. 数据可视化【十】绘制地图
  8. vc++6.0 模拟鼠标点击代码 木马程序的编写 VC 模拟键盘输入
  9. 将ocx和DLL文件打包成cab文件,inf的编写
  10. docker中使用postgresql
  11. oracle空值减去一个数_Oracle 空值(null)有关的函数
  12. Python 机器学习:多元线性回归
  13. 趣头条将获得阿里1.71亿美元的可转债,为期三年
  14. python django做网页论文_Python Web程序-Django框架搭建网站的简单介绍
  15. vue 固定div 滚动_Vue - 让水平滚动条(scroll bar)固定在浏览器的底部
  16. vector的初始化和使用
  17. X Chen笔记---百度云破解限速
  18. 华为新机亮剑鸿蒙系统,华为亮剑,超级环绕屏+麒麟9000+鸿蒙系统,欣喜油然而生...
  19. 迈阿密牛津计算机专业,迈阿密大学牛津分校计算机科学
  20. 最全IDC数据中心知识讲解(一)

热门文章

  1. 简单的Qt倒计时程序--番茄钟
  2. 【STM32H7教程】第39章 STM32H7的DMAMUX基础知识(重要)
  3. APP自动化测试--IOS
  4. Python_072205_创建一个类方法记录车的品牌mark、颜色color、价格price、速度speed等特征, 并实现增加车辆信息、显示车辆全部信息的功能。
  5. Visual Studio 2008破解激活升级方法【转】
  6. 20200726 plecs 元件显示变量名
  7. C语言基础程序题及答案(适合学完C基础的人练练手)
  8. 工作量统计系统 python_软件测试工作量统计新方法
  9. win7 桌面计算机不显示器,Win7电脑显示器黑屏不显示的解决方案
  10. 对抗网络学习-FGSM对抗样本生成