福永论坛网站建设,江苏商城网站建设服务,电商平台代运营,wordpress 高清背景触发器是一种数据库对象#xff0c;一般与一个表相关联#xff0c;当对该表做出某种修改操作#xff08;INSERT、DELETE、UPDATE#xff09;时#xff0c;它会自动地予以执行。触发器可以查询其它表#xff0c;并可以包含复杂的SQL#xff08;或Transact-SQL#xff09…触发器是一种数据库对象一般与一个表相关联当对该表做出某种修改操作INSERT、DELETE、UPDATE时它会自动地予以执行。触发器可以查询其它表并可以包含复杂的SQL或Transact-SQL语句。
触发器经常用于加强数据的完整性约束和业务规则等。
由于每个厂商对trigger的实现不同这里以SQL Server为例。
特点
1它与表紧密相连可以看作表定义的一部分
2它不能通过名称被直接调用更不允许带参数而是当用户对表中的数据进行修改时自动执行
3它可以用于SQL Server约束、默认值和规则的完整性检查实施更为复杂的数据完整性约束
一个触发器定义包含以下三个部分ECA
1事件Event激活触发器执行的数据库改变事件可能是在某个特定表上执行的UPDATE、DELETE、INSERT等操作
2条件Condition是触发器能够执行必须满足的条件
3动作Action当触发器被激活且条件为真时DBMS要执行的过程
SQL Server中trigger的类型
1INSERT触发器可以完成对输入数据的审核用来修改或拒绝接受正在插入的记录
2DELETE触发器用于约束用户能够从数据库中删除的数据
3UPDATE触发器约束用户对表中数据的update操作
4以上几种类型的组合触发器
trigger用途
1当某些表修改时可以读取或修改其他的表或数据库保证数据库的一致性
2比较数据前后版本的不同提供高级的审计和透明事件记录
3自动地生成导出列通过表达式计算出的列的值
4施行复杂的安全性确认和事务约束
5维护同步表
触发器与约束
1.在特殊情况下各有优势。
2.触发器的主要好处在于它们可以包含使用 T-SQL 代码的复杂处理逻辑。
3.在约束所支持的功能无法满足应用程序的功能要求时触发器就极为有用。
创建trigger
基本格式为
CREATE TRIGGER trigger_name
ON {table | view}
{FOR | INSTEAD OF} {[INSERT] [,] [UPDATE] [,] [DELETE]}
ASsql_statement [ ...n ] [RETURN]其中
1.trigger_name是触发器的名称同样在数据库中必须唯一。而Table | view是在其上执行触发器的表或视图有时称为触发器表或触发器视图
2.FOR指定触发器只有在触发SQL语句INSERT、UPDATE、DELETE中指定的所有操作都已成功执行后才激发而且只能在表上定义。所有的引用级联操作和约束检查也必须成功完成后才能执行此触发器
3.INSTEAD OF 指定执行触发器而不是执行触发 SQL 语句从而替代触发语句的操作。在表或视图上每个INSERT、UPDATE或DELETE语句最多可以定义一个INSTEAD OF触发器
4.{ [DELETE] [,] [INSERT] [,] [UPDATE] }是指定在表或视图上执行哪些数据修改语句时将激活触发器的关键字。必须至少指定一个选项。在触发器定义中允许使用以任意顺序组合的这些关键字。如果指定的选项多于一个需用逗号分隔这些选项
5.sql_statement是触发器的条件和动作。触发器条件指定其它准则以确定 DELETE、INSERT 或 UPDATE 语句是否导致执行触发器操作。当尝试 DELETE、INSERT 或 UPDATE 操作时T-SQL语句中指定的触发器操作将生效对每个语句触发器只执行一次即使此语句修改了好几行
triggers on Views
正常情况下我们无法修改一个虚拟的视图因为这个视图是不存在的但是我们可以通过触发器来对视图进行修改。
如首先创建一个视图
CREATE VIEW Synergy
ASSELECT Likes.drinker, Likes.beer, Sells.barFROM Likes, Sells, FrequentsWHERE Likes.drinker Frequents.drinkerAND Likes.beer Sells.beerAND Sells.bar Frequents.bar;然后我们对该视图创建一个触发器
CREATE TRIGGER ViewTrig
ON Synergy
INSTEAD OF INSERT
ASINSERT INTO Likes SELECT drinker, beer FROM INSERTED;INSERT INTO Sells(bar, beer) SELECT bar, beer FROM INSERTED;INSERT INTO Frequents SELECT drinker, bar FROM INSERTED;创建完以后我们就可以对视图进行INSERT操作
INSERT INTO Synergy VALUES(Tom, 科罗娜, 3DArtBar);删除trigger
DROP TRIGGER { 触发器名称 } [ ,...n ]当某个表被删除后该表上的所有触发器将同时被删除但是删除触发器不会对表中的数据有影响。
trigger应用实例
准备数据
create table student(sno char(5) primary key,sname char(8) not null,age smallint check(age 15 and age 35),sex nchar(1) check(sex 男 or sex 女)
)
create table course(cno char(4) primary key,cname char(20) not null,teacher char(8)
)
create table study(sno char(5) foreign key references student(sno),cno char(4) foreign key references course(cno),score smallint,primary key(sno, cno)
)应用
1.为study表创建一个UPDATE触发器当更新成绩时要求更新后的成绩不能低于原来的成绩。
create trigger update_score
on study
instead of update
asdeclare sno char(5), cno char(4), score1 smallint, score2 smallintselect sno sno, cno cno, score1 score from insertedselect score2 scorefrom deletedif(score1 score2)update study set score score1where study.cno cno and study.sno sno;
go --批处理的标志把程序分为一个个代码块每个被go分隔的语句都是独立的事务
update study
set score 80
where sno 98601 and cno C601; --因为更新的分数小于原分数所以更新失败2.为study表创建一个DELETE触发器要求一次只能从study表中删除一条记录。
create trigger del_one
on study
instead of delete
asdeclare num int, sno char(5), cno char(4)select num count(*) from deletedif num 1begin select sno sno, cno cno from deleteddelete from study where sno study.sno and cno study.cnoendelse print要删除的记录多于1条;
go
delete from study
where sno 98601; --因为删除多条记录所以输出打印信息要删除的记录多于1条3.为course表创建一个INSERT触发器要求插入的课程记录中任课教师不能为空。
create trigger insert_course on course
instead of insert
asdeclare cno char(4), cname char(20), teacher char(8)select teacher teacher from insertedif(teacher is null) print教师名不能为空;else beginselect cno cno, cname cname from insertedinsert into course values(cno, cname, teacher)end;
go
insert into course(cno, cname) values(C606, 计算机组成原理);