APP下载

SQL Server触法器的应用

2018-01-28于康娟

太原学院学报(自然科学版) 2018年4期
关键词:开户触发器数据表

于康娟

(太原城市职业技术学院, 山西 太原030027)

前言

触发器是一类特殊的存储过程[1],除了具备存储过程的提前编译、高效执行、一旦创建即存在于数据库服务器端,简化业务逻辑维护,减少网络流量等特点之外,还具备基于特定事件驱动的即时响应和自动执行的能力[2],故在数据库应用程序开发中得到了广泛应用。

1 触发器分类

1.1 DML触发器

当在数据表上执行了INSERT,DELETE,UPDATE操作时,DML 触发器被触发,它被广泛应用于维护数据完整性和强制执行一些业务规则。

1.1.1INSERT触发器

INSERT触发器在数据表中执行INSERT操作时被触发,系统会自动在内存中创建INSERTED临时表,它在结构上和触发器所在表的结构相同,用来保存INSERT操作时数据的副本,触发器执行完成后,INSERTED表自动会被删除[3]。

1.1.2DELETE触发器

DELETE触发器在数据表中执行DELETE操作时被触发,系统会自动在内存中创建DELETED临时表,它在结构上和触发器所在表的结构相同,用来保存DELETE操作时数据的副本,触发器执行完成后,DELETED表自动会被删除。

1.1.3UPDATE触发器

UPDATE触发器在数据表中执行UPDATE操作时被触发,系统会自动在内存中创建INSERTED和DELETED两个临时表,它在结构上和触发器所在表的结构相同,DELETED表用来保存UPDATE操作时数据修改前的副本,INSERTED用来保存UPDATE操作时数据修改后的副本,触发器执行完成后,INSERTED和DELETED表自动会被删除。

1.1.4INSTEAD OF触发器

INSTEAD OF触发器可以定义在视图上,替代INSERT、DELETE、UPDATE操作,完成通过视图无法执行的一些DML操作。

1.2 DDL 触发器

DDL 触发器是用来维护数据库和服务器的安全性,对数据库中的对象及服务器中的对象起到保护作用。当服务器或数据库中发生 DDL 事件时被触发[4]。

2 触发器的设计

对于触发器的设计,应结合具体的业务规则及数据的处理要求从以下几方面来考虑:

1)明确创建哪种类型触发器;

2)如果是DDL操作,确定是基于数据库还是基于服务器;如果是DML操作,确定在哪些数据表中创建触发器;

3)确定触发时机及触发事件;

4)编程实现触发器的关联动作;

5)最后考虑触发器的安全性,是否需要加密。

3 触发器的具体应用

基于触发器的自动执行这一特点,它在各行各业后台数据库的维护中起到了重要作用,它对于多表数据的一致性维护、及时性更新以及添加权限的判断方面得到了广泛应用。

3.1 利用触发器维护数据的完整性

在学生成绩管理系统中有学生信息表(T_Student)和成绩表(T_Score)

结构如下:

T_Student(S_number,S_name,Sex,Birthday,Nation,Politics,Department,PostalCode,Address,Phone)

T_Score (S_number,C_number,Score)

假如有一名学生转学,需要从学生信息表中删除学生信息,那么学生成绩表中的信息也要相应做删除,从而保证数据库中数据一致性。

if exists(select * from sys.triggers where name=′tr_student_delete′)

drop trigger tr_student_delete

go

create trigger tr_student_delete

on T_student

with encryption

for delete

as

declare @n int,@stuno varchar(8)

select @stuno=(select S_number from deleted)

select @n=count(*) from T_Score where S_number=@stuno

if @n<>0

begin

print ′成绩表有数据删除!′

delete from T_score where S_number=@n

end

else

print ′该学生没有选课,无成绩信息!′

go

delete from T_student where S_name=′刘华′

3.2 利用触发器实现普通约束所不能实现的数据完整性

在商品信息库中有商品信息表和销售信息表,结构如下:

Goods (商品编号,商品名称,生产厂商,进货价,零售价,库存数量,进货时间,进货员工编号)

Sell(销售编号,商品编号,销售数量,售出时间,售货员工编号)

假如每销售一笔商品,需要自动完成库存数量的统计,能及时反映最新库存数量。

if exists(select * from sys.triggers where name=′tr_ Sell _insert′)

drop trigger tr_ Sell _insert

go

create trigger tr_ Sell _insert

on Sell

with encryption

for insert

as

declare @num int,@goodno varchar(3)

select @num=销售数量,@goodno=商品编号from inserted

update Goods set库存数量=库存数量-@num where商品编号=@goodno

print @goodno +‘最新库存量信息如下:’

select * from Goods where 商品编号=@goodno

go

3.3 利用触发器实现复杂的业务规则

在银行数据业务管理数据库中有银行开户卡信息表和客户信誉度信息表,结构如下:

userInfo (customerID,customerName,PID,telephone,address)

userCred(customerID,CustomerCred)

银行在给用户办理开户业务时,需要检查此客户的信誉值,如果信誉值小于银行规定的定数值,是要被拉入系统的黑名单的,此客户开户将会不成功。

if exists(select * from sys.triggers where name=′tr_ userInfo _insert′)

drop trigger tr_ userInfo _insert′

go

create trigger tr_ userInfo _insert′on Sell

with encryption

for insert

as

declare @cred int

select @cred= CustomerCred from userCred where customerID=( select customerID from inserted)

if @cred<1

begin

print ‘此用户不满足信誉要求,已经被列入黑名单,开户失败!!’

rollback transaction

end

else

print ‘此用户开户成功!’

go

3.4 利用触发器保护数据库对象的安全性

利用触发器保护数据库中的数据表不被删除。

if exists(select * from sys.triggers where name=′tr_drop_table′)

drop trigger tr_drop_table on database

go

create trigger tr_drop_table

on database

for drop_table

as

print′你不能删除数据表!′

rollback transaction

go

3.5 利用触发器保护服务器的安全性

利用触发器保护在服务器中不能随意创建数据库。

if exists(select * from sys.server_triggers where name=′tr_create_database′)

drop trigger tr_create_database on all server

go

create trigger tr_createdatabase

on all server

for create_database

as

print ′你不能创建数据库!′

rollback transaction

go

4 结束语

本文对学生成绩管理、商品信息管理、银行数据业务管理系统中数据完整性约束及特定的业务规则进行了较为深入地探讨和分析,根据各应用系统的特点和规律进行了几类典型触发器设计,并通过SQL Server得以实现。由于触发器的自动响应,高效运行的特点,使得它在数据库应用系统的设计中居于重要的地位,掌握开发触发器的技术,编写出高效率的触发器逻辑,是数据库应用程序开发成功的重要保障[5]。

猜你喜欢

开户触发器数据表
浅谈时序逻辑电路的成长记忆
湖北省新冠肺炎疫情数据表(2.26-3.25)
湖北省新冠肺炎疫情数据表
湖北省新冠肺炎疫情数据表
伪造证件开户风险亟待关注
基于列控工程数据表建立线路拓扑关系的研究
触发器在酒店管理系统中的应用
几种常见触发器工作方式的讨论
基于电路原理的触发器波形分析