实验8补充 创建触发器
触发器创建实验
触发器的创建实验实验一:创建一个INSERT触发器“TR_Stu_Insert”,当在STUDENT表中插入一条新记录时,触发该触发器,并给出“你插入了一条新记录!”的提示信息。
实现本题的方法如下:步骤一:在SQL Server管理控制台中,展开STUDENT数据库,右击STUDENT表中的“触发器”文件夹。
从弹出的快捷菜单中选择“新建触发器”选项。
步骤二:单击“查询”菜单中的“指定模板参数的值”菜单项,在“指定模板参数的值”对话框中,将参数“Schema_Name”的值修改为“dbo”,参数“Trigger_Name”的值修改为“TR_Stu_Insert”,参数“Table_Name”的值修改为“T_STUDENT”,参数“Data_Modification_Statements”的值修改为“INSERT”。
单击“确定”按钮。
步骤三:在新建触发器模板窗口中,在BEGIN和END语句之间输入以下3条语句:DECLARE @msg char(30)SET @msg='你插入了一条新记录!'PRINT @msg步骤四:单击工具栏上的“执行”按钮,即可完成此触发器的创建。
实验二:创建了Stu_Insert触发器后,查看向T_STUDENT表中插入数据时,此触发器所完成的功能:检查该学生的选修课程必须在3门以上,否则拒绝该学生数据。
在SQL Server管理控制台中新建一个查询,并输入以下SQL语句:USE STUDENTGOinsert into T_STUDENT(S_NUMBER,S_NAME,SEX)values('0554115','王小帆','女')GO实验三:创建一个AFTER触发器,要求实现以下功能:在SCORE表上创建一个插入、更新类型的触发器TR_ScoreCheck,当在SCORE字段中插入或修改考试分数后,触发该触发器,检查分数是否在0-100之间。
实验 触发器设计
实验8 触发器设计一、实验目的:通过本实验了解数据库触发器的概念,掌握触发器完整性设计方法。
二、实验原理触发器(Trigger)是用户定义在关系表上的一类由事件驱动的特殊过程,由服务器自动激活可以进行更为复杂的检查和操作,具有更精细和更强大的数据控制能力。
创建触发器语法格式CREATE TRIGGER <触发器名>{BEFORE | AFTER} <触发事件> ON <表名>FOR EACH ROW[WHEN <触发条件>]<触发动作体>触发时间:Before, AFTER触发事件:insert,update, delete删除触发器:drop trigger <触发器名>显示创建触发器脚本>show create trigger <触发器名>>show triggers;三、实验内容及方法实验平台操作系统:win7,数据库管理平台:mysql5.6或者mysql8,实验用数据库:老师提供的数据库脚本TradeDBSQL.txt(一)触发器应用于数据库完整性设计实体完整性-PK参照完整性-FK用户定义完整性1.参照完整性级联约束在订单表Orders(主表)与订单细节表OrderDetails(副表)中实现更新、删除级联是通过下列方式实现的foreign key(OrderID) references Orders (OrderID)on delete cascade on update cascade用下面的更新、删除触发器实现上面的更新、删除级联1)更新级联触发器orderd_updDELIMITER %% /* 用%% 代替; 作为命令结束符*/Create trigger orderd_upd /* 创建触发器名为orderd_upd */after update on Orders /* 在表orders 上建立更新后触发器*/for each row /* 对于每一行*/begin/* 在表orders上更新后自动更新OrderDetails 表*/ update OrderDetails set OrderID = new.OrderID where OrderID=old.OrderID; end %%特别要注意new,old 的区别old 表示更新前的一行记录(for each row)new 表示更新为新的数据的一行记录。
触发器的创建和管理
触发器的创建和管理实验——图书馆日常事务管理系统触发器的创建和管理1.创建触发器(1)使用SSMS建触发器在TSJYMS数据库的图书类别表上创建一个名为tslb_insert_trigger的触发器,当执行INSERT操作时,该触发器被触发,禁止插入记录。
CREA TE TRIGGER tslb_insert_trigger ON图书类别FOR INSERTASBEGINPRINT('禁止插入记录!')ROLLBACK TRANSACTIONEND(2)使用T-SQL语句创建触发器①在TSJYMS数据库的图书明细表上创建一个名为ts_delete_trigger的触发器,当执行DELETE操作时,该触发器被触发,禁止删除记录。
CREA TE TRIGGER ts_delete_trigger ON图书明细表FOR DELETEASBEGINPRINT('禁止删除记录!')ROLLBACK TRANSACTIONEND②在TSJYMS数据库的借还明细表上创建一个名为jhmx_update_trigger的触发器,当执行UPDARE操作时,该触发器被触发,不允许修改表中的图书编号。
CREA TE TRIGGER jhmx_update_trigger ON借还明细表INSTEAD OF UPDA TEASIF UPDA TE(图书编号)PRINT('禁止删除记录!')2)多表级联更改触发器的创建①在TSJYMS数据库的读者信息表上创建一个名为dzxx_insert_trigger的触发器,当在读者信息表中插入记录时,将该记录中的借书证号自动插入借还明细表中。
CREA TE TRIGGER dzxx_insert_trigger ON读者信息FOR INSERTASDECLARE@NUM CHAR(20)SELECT@NUM=借书证号FROM INSERTEDINSERT借还明细表(借书证号)VALUES(@NUM)②在TSJYMS数据库的图书明细表上创建一个名称为tsmx_update_trigger触发器,当修改图书明细表中的图书编号时,如果借还明细表中引用了该图书编号,则禁止修改,并提示“不能修改!”CREA TE TRIGGER tsmx_update_trigger ON图书明细表FOR UPDA TEASIF UPDA TE(图书编号)BEGINDECLARE@BIANHAO CHAR(20)SELECT@BIANHAO=DELETED.图书编号FROM DELETEDIF EXISTS(SELECT图书编号FROM借还明细表WHERE图书编号=@BIANHAO) BEGIN PRINT('用户不能修改!')ROLLBACK TRANSACTIONENDELSEPRINT('修改完成!')END3)触发器功能验证对所创建的各种触发器进行功能验证,检查其设计的正确性。
实验八触发器
《数据库系统原理》实验报告八题目:实验八触发器学号:xxxxxxxxxxx 姓名:lrm_1036 日期:2010-12-30一、实验环境:SQL server 2005二、实验目的:1. 掌握创建、修改、删除和执行触发器的方法;2. 完成上机练习。
三、实验内容与完成情况:(要求:提交源程序并标识必要的注释。
保证程序能正确编译和运行,认真填写实验报告。
)1.创建和执行触发器(1)交互式为数据库表Student创建一级联更新触发器TRIGGER_S(要求:若修改Student表中一学生的学号,则SC表中与该学生相关的学号自动修改)·启动SSMS,在“对象资源管理器”中,展开“数据库”→“实验”→“表”→“dbo.Student对象”。
右击“触发器”,在打开的快捷菜单中,选择“新建触发器”,打开触发器编辑窗口,如图1.1所示.图1.1·将窗口内模板语句修改为下列SQL语句:CREATE TRIGGER TRIGGER_SON Student FOR UPDATE AS IF UPDATE(SNO)BEGINDECLARE @SNO_NEW INT, @SNO_OLD INT--声明SELECT @SNO_NEW=SNO FROM INSERTED --查找新数据和SELECT @SNO_OLD=SNO FROM DELETED --查找旧数据UPDATE SC SET SNO=@SNO_NEW WHERE SNO=@SNO_OLD--把新数据更新到SC表中END·单击工具栏中的分析按钮,检查语法是否正确。
·单击执行按钮,保存创建的触发器,如图1.2所示。
图1.2·验证触发器的作用:a.在SSMS中,打开数据库表Student和SC的数据表,可以看到,在Student中学号为1001的学生在SC表中有3条记录。
b.查看数据库表Student和SC之间是否已创建外键参照关系,若已创建,则删除。
实验报告 触发器
实验报告触发器实验报告:触发器引言:触发器是数字电路中常见的重要元件,它可以存储和控制信号的传输。
本实验旨在通过实际搭建触发器电路,了解其工作原理和应用。
一、实验目的本实验的目的是通过实际搭建触发器电路,掌握触发器的工作原理、特性和应用。
二、实验器材和原理2.1 实验器材:- 电路实验板- 电源- 电压表- 电流表- 逻辑门芯片- 连接线2.2 实验原理:触发器是一种存储器件,可以存储和控制信号的传输。
它由多个逻辑门组成,根据输入信号的不同,可以分为RS触发器、D触发器、JK触发器和T触发器等多种类型。
三、实验步骤3.1 搭建RS触发器电路首先,将两个逻辑门芯片连接在电路实验板上,一个作为RS触发器的输入端,另一个作为输出端。
然后,将电源和适当的电阻连接到逻辑门芯片上,以提供所需的电压和电流。
最后,根据电路图连接连线,搭建完整的RS触发器电路。
3.2 检验和调试电路在搭建好电路后,使用电压表和电流表检验电路的电压和电流是否正常。
如果有异常,需要及时排除故障。
然后,通过改变输入信号,观察输出信号的变化。
根据实验结果,对电路进行调试,确保触发器的正常工作。
3.3 测试触发器的特性在调试完电路后,可以进行一些实验来测试触发器的特性。
例如,可以通过改变输入信号的频率和占空比,观察输出信号的变化。
还可以通过改变逻辑门芯片的类型,比较不同类型触发器的性能差异。
四、实验结果和分析通过实验,我们可以得到触发器的工作特性和性能数据。
根据实验结果,我们可以分析触发器的优缺点,以及在数字电路设计中的应用。
五、实验总结触发器作为数字电路中的重要元件,在现代电子技术中得到了广泛应用。
通过本实验,我们深入了解了触发器的工作原理、特性和应用。
同时,我们也学会了搭建触发器电路、调试电路和分析实验结果的方法。
六、实验心得通过本次实验,我深刻认识到了触发器在数字电路中的重要性。
触发器可以存储和控制信号的传输,是数字电路中的核心部件之一。
数据库技术与应用实验八
实验8 存储过程和触发器1.实验目的(1)掌握通过SQL Server管理平台和Transact-SQL语句CREATE PROCEDURE 创建存储过程的方法和步骤。
(2)掌握使用Transact-SQL语句EXECUTE执行存储过程的方法。
(3)掌握通过SQL Server管理平台和Transact-SQL语句ALTER PROCEDURE 修改存储过程的方法。
(4)掌握通过SQL Server管理平台和Transact-SQL语句DROP PROCEDURE删除存储过程的方法。
(5)掌握通过SQL Server管理平台和Transact-SQL语句CREATE TRIGGER创建触发器的方法和步骤。
(6)掌握引发触发器的方法。
(7)掌握使用SQL Server管理平台或Transact-SQL语句修改和删除触发器。
(8)掌握事务、命名事务的创建方法,了解不同类型的事务的处理情况。
2.实验内容及步骤(1)在查询设计器中输入以下代码,创建一个利用流控制语句的存储过程letters_print,该存储过程能够显示26个小写字母。
CREATE PROCEDURE letters_printASDECLARE @count intSET @count=0WHILE @count<26BEGINPRINT CHAR(ASCII('a')+ @count)SET @count=@count +1END单击查询分析器的“执行查询”按钮,查看studentsdb数据库的存储过程是否有letters_print。
使用EXECUTE命令执行letters_print存储过程。
(2)输入以下代码,创建存储过程stu_info,执行时通过输入姓名,可以查询该姓名对应的学生的各科成绩。
CREATE PROCEDURE stu_info @name varchar(40)ASSELECT a.学号,姓名,课程编号,分数FROM student_info a INNER JOIN grade taON a.学号= ta.学号WHERE 姓名= @name使用EXECUTE命令执行存储过程stu_info,其参数值为“马东”。
创建触发器——精选推荐
创建触发器创建触发器的语法格式如下图:CREATE TRIGGER语句⽤于将触发器添加到数据库中。
所谓触发器是指在发⽣指定的数据库事件时⾃动执⾏的数据库操作。
通常情况下,触发器必须指定⼀个关联表,当这个关联表发⽣了触发器指定的操作时,触发器就将⾃动进⾏定义的操作。
例如:CREATE TRIGGER tri_t1 before insert on t1Begin……End.通常情况下,触发器有三个要素:时机,即什么时候启动触发器。
条件,即启动触发器的条件。
关联表,这个是触发器关联的数据表,当数据表删除时,也会⾃动删除创建的触发器;在SQLITE中,时机部分是可忽略的(默认是before),⽽条件是不允许省略的,每个触发器必须指定将针对以下操作之⼀触发:DELETE,INSERT,UPDATE。
触发器为删除,插⼊或更新的每⼀⾏触发⼀次。
如果BEFORE UPDATE或BEFORE DELETE触发器修改或删除了将要更新或删除的⾏,则后续更新或删除操作的结果很难确定。
此外,如果BEFORE触发器修改或删除了⼀⾏,则不确定是否会触发在其他⾏上的AFTER触发器。
因此,如果使⽤BEFORE,则尽量不要对改⾏数据进⾏删除或更改。
此外,在INSERT操作中使⽤BEFORE操作时,如果表中没有显⽰的ID栏,则不会更改NEW.rowid的值。
当然,通常情况下,此时的NEW.rowid值通常情况下也不重要。
事实上,如果定义了⾮空的ID值,⽽在插⼊数据前并不知道这个值时,使⽤BEFORE INSERT的触发器其实挺⽅便有效的。
例如,每次插⼊数据时,设置NEW.ID为max(ID)+1,即可以避免缺少⾮空值的缺乏⽽报警,⼜能避免ID值重复。
通过在CREATE TRIGGER语句中指定INSTEAD OF,可以在视图以及普通表上创建触发器。
如果在视图上定义了⼀个或多个ON INSERT,ON DELETE或ON UPDATE触发器,那么分别在视图上执⾏INSERT,DELETE或UPDATE语句就不会出错。
实验八 触发器的使用
实验八触发器的使用一、实验目的●掌握触发器的创建、修改和删除操作。
●掌握触发器的触发执行。
●掌握触发器与约束的不同。
二、实验要求1.创建触发器。
2.触发器执行触发器。
3.验证约束与触发器的不同作用期。
4.删除新创建的触发器。
三、实验内容(一)示例1.创建触发器①启动SQL Server 查询编辑器,选择要操作数据库,如“sc(学生选课)”数据库。
②在查询命令窗口中输入以下CREATE TRIGGER语句,创建触发器。
为sc(学生选课)表创建一个基于UPDATE操作和DELETE操作的复合型触发器,当修改了该表中的成绩信息或者删除了成绩记录时,触发器被激活生效,显示相关的操作信息。
2.触发触发器①在查询命令窗口中输入以下UPDATE sc语句,修改成绩列,激发触发器。
UPDATE scSET grade=grade+5WHERE 课程号=’3’②在查询命令窗口中输入以下UPDATE sc语句修改非成绩列,激发触发器。
UPDATE scSET cno=’9’WHERE 课程号=’1’③在查询命令窗口中输入以下DELETE sc 语句,删除成绩记录,激发触发器。
DELETE scWHERE cno=’7’3. 比较约束与触发器的不同作用期①在查询命令窗口中输入并执行以下ALTER TABLE 语句,为sc表添加一个约束,使得成绩只能大于等于0且小于等于100。
ALTER TABLE scADD CONSTRAINT CK_成绩CHECK(grade>=0 ANDgrade<=100)②在查询命令窗口中输入并执行以下UPDATE sc语句,查看执行结果。
UPDATE scSET grade=120WHERE cno=’3’③在查询命令窗口中输入执行以下UPDATE sc语句,查看执行结果。
UPDATE scSET grade=90WHERE cno=’3’4. 删除新创建的触发器①在查询命令窗口中输入DROP TRIGGER 语句,删除新创建的触发器。
触发器及应用实验的过程
触发器及应用实验的过程触发器是数据库中的一个概念,用于在特定的数据库操作(例如插入、更新、删除)发生时自动触发一些事先定义好的操作。
触发器通常用于确保数据的一致性,并对数据库中的操作进行监控和管理。
在本文中,我将介绍触发器的基本概念和一些常见的应用实例,并详细讲解触发器及应用实验的过程。
一、触发器的基本概念触发器是数据库中的一个对象,它与特定的表相关联,并且在表中的特定操作发生时被自动激活。
触发器可以定义在以下几种操作上:1. INSERT:当在表中插入一条新记录时触发。
2. UPDATE:当更新表中的记录时触发。
3. DELETE:当在表中删除一条记录时触发。
触发器通常由以下几个组成部分构成:1. 触发时间:指定触发器被激活的时间,可以是在操作之前(BEFORE)或操作之后(AFTER)。
2. 触发事件:指定触发器与之相关联的操作,即INSERT、UPDATE或DELETE。
3. 触发操作:指定触发器被激活时执行的具体操作,可以是SQL语句或存储过程。
二、触发器的应用实例触发器在数据库中有很多应用实例,下面列举几个常见的例子来说明触发器的用法。
1. 数据完整性约束触发器可以用来维护数据库的数据完整性。
例如,当在订单表中插入一条订单记录时,可以使用触发器检查该订单的总金额是否小于客户的信用额度。
如果超出了信用额度,触发器可以自动拒绝该操作。
2. 记录审计跟踪触发器可以用来跟踪对数据库的变更操作。
例如,可以创建一个触发器,在每次更新员工表时,自动记录这个更新的操作人员、时间和变更的内容。
3. 数据集成与同步触发器可以用来实现数据库之间的数据集成和同步。
例如,当在一个数据库中插入一条新的产品记录时,可以使用触发器将该记录同步到其他相关的数据库中。
三、触发器及应用实验的过程下面将介绍触发器及应用实验的具体过程。
1. 创建触发器首先,我们需要创建一个触发器对象,并指定它与哪张表相关联以及在何时触发。
例如,可以使用以下语句创建一个在订单表上触发的触发器:CREATE TRIGGER `order_audit_trigger` AFTER INSERT ON `order`FOR EACH ROW BEGIN触发器的具体操作INSERT INTO `order_audit` (`order_id`, `user_id`, `create_time`)VALUES (NEW.`id`, NEW.`user_id`, NOW());END;在这个例子中,触发器将在订单表上的每次插入操作之后激活,并向order_audit表中插入一条相应的审计记录。
数据库实验卡8-数据库的触发器
天津师范大学软件学院数据库原理实践课程实验卡
实验序号:8 实验室名称:计信学院实验室
实验名称数据库的触发器
实验类型验证计划学时 2 人组数 1 首开日期
面向专业(逐个填写)
主要配置仪器设备名称设备规格型号每组台件数
1.计算机 1
2.投影仪 1
消耗材料名称每组消耗量消耗材料名称每组消耗量
实验项目简介
实验目的:
通过上机实验验证数据库的触发器操作。
实验内容:
1、将students数据库还原。
2、在students数据库中,完成以下单表查询的操作,将每一个程序保存为.sql。
(1)创建触发器每当用户在SC表中插入一行数据时,就显示一个提示信息。
(2)创建触发器限定Course表中Semester的取值范围为1-10。
(3)创建触发器限制每个学期开设的课程总数不能超过10门,如果超过了10门,则给出提示信息:本学期课程太多。
(4)创建触发器在SC表中,不能删除考试成绩不及格学生的该门课程的考试记录。
(5)创建触发器在SC表中,不能将不及格的考试成绩改为及格。
(6)创建触发器防止在Students数据库中删除和更改任何表。
实验要求:
(1)在SQL Server2008中完成上述操作,将数据库重新备份。
(2)将每一个.sql程序包成一个文件,提交该压缩文件。
1。
触发器功能测试实验报告
触发器功能测试实验报告引言触发器是数据库中一种强大的功能,用于在特定条件满足时自动触发某些操作。
本实验旨在测试触发器在数据库管理系统中的功能和效果。
通过本实验,我们将深入了解触发器的工作原理,并验证其可靠性和效率。
实验环境为了进行本实验,我们使用了以下软件和工具:•数据库管理系统:MySQL 5.7•开发环境:Visual Studio Code•编程语言:SQL•操作系统:Windows 10实验步骤步骤一:创建测试数据库首先,我们需要创建一个测试数据库,用于存储我们后续实验所需的表和数据。
在MySQL中,我们可以使用以下SQL语句来创建一个名为test_db的数据库:CREATE DATABASE test_db;步骤二:创建测试表接下来,我们需要在测试数据库中创建一些表,用于模拟实际应用中的数据操作。
假设我们要创建一个名为users的表,用于存储用户信息。
该表包含以下字段:id(整型,主键)、name(字符串,用户姓名)、age(整型,用户年龄)。
使用以下SQL语句可以在test_db数据库中创建users表:CREATE TABLE users (id INT PRIMARY KEY,name VARCHAR(255),age INT);步骤三:创建触发器在本实验中,我们将创建一个简单的触发器,用于在users表中插入新记录时自动更新一个计数器表。
假设我们要创建一个名为counter的表,用于存储插入users表的记录总数。
首先,我们需要在test_db数据库中创建counter表:CREATE TABLE counter (count INT);然后,我们可以使用以下SQL语句创建触发器:DELIMITER $$CREATE TRIGGER user_insert_trigger AFTER INSERT ON usersFOR EACH ROWBEGINUPDATE counter SET count=count+1;END;$$DELIMITER ;步骤四:测试触发器现在,我们已经完成了触发器的创建,可以进行测试了。
(完整版)触发器的创建与测试
触发器的创建与测试实例实验环境:系统:windows XP 软件:oracle 9i实验内容:1、公司的作业小队、数据审核部门等公司内部用户还是外部用户登陆,系统均能自动记载这些用户登陆以及注销的时间。
2、数据库出错也要有记载;数据库启动和关闭时,系统应自动记载启动/ 关闭的时间、用户名等。
3、禁止数据审核部门用户在早8点之前、下午6点之后、以及周六、周日时间登陆数据库实验过程:一、创建触发器1、创建表CREATE TABLE "SYS”。
”TABLE_LOG_ON” ("DATABASE_NAME” VARCHAR2(100),"EVENT_NAME" VARCHAR2(100), "EVENT_TIME" DATE,”TRIGGER_USER"VARCHAR2(100));创建用户登录触发器:CREATE OR REPLACE TRIGGER ”SYS"."TRIGER_LOGON” AFTERLOGON ON DATABASEBEGIN INSERT INTO TABLE_LOG_ON(DATABASE_NAME,EVENT_NAME,EVENT_TIME,TRIGGER_USER)VALUES(SYS.DATABASE_NAME,SYS.SYSEVENT,SYSDATE,USER); END;2、创建表CREATE TABLE ”SYS"."TABLE_LOG_OFF” ("DATABASE_NAME” VARCHAR2(100),"EVENT_NAME" VARCHAR2(100), "EVENT_TIME" DATE, "TRIGGER_USER"VARCHAR2(100));创建用户注销触发器:CREATE OR REPLACE T RIGGER ”SYS"。
触发器的创建与使用
03
02
触发器:是一种数据库对象,用于在数据库 表上自动执行特定操作。
04
使用场景
触发器:用于处理复杂的业务逻辑,如数 据验证、数据同步等。
05
06
视图:用于简化复杂的SQL查询,提供给 用户一个简化的数据视图。
触发器与函数
定义与功能 触发器:是一种特殊的存储过程,用 于在数据库表上自动执行特定操作。
触发器的作用
1 2
数据完整性维护
触发器可以用于确保数据的完整性和准确性,通 过在数据修改前后自动执行验证逻辑。
自动日志记录
触发器可以用于自动记录数据修改事件,如记录 数据修改的时间、修改前后的数据状态等。
3
自动级联操作
触发器可以用于自动执行级联操作,例如在删除 某个表中的记录时,自动删除与之关联的其他表 中的记录。
安全性
简化业务逻辑
触发器可以用于实施安全策略,例如限制 对敏感数据的访问或强制执行某些操作。
在某些情况下,触发器可以帮助简化业务 逻辑,减少应用程序中的代码量。
触发器的缺点
性能问题
触发器在数据库操作中会增加额外的执 行时间,特别是在高并发的系统中,可
能会影响性能。
难以管理
随着触发器的数量增加,管理它们会 变得更加困难,尤其是在大型系统中。
自动化任务执行
在特定时间或条件下自动执行某些任务,例如发送邮件、更新数 据库等。
数据验证
在数据插入、更新或删除之前,对数据进行验证,确保数据符合 预设规则。
事件响应
对特定事件或操作进行响应,例如用户登录、订单创建等。
如何使用触发器
01
创建触发器
根据需求,在数据库中创建相应的 触发器。
触发器的创建
为什么需要触发器为什么需要触发器(TRIGGER)呢?典型的应用就是银行的取款机系统假定该系统的数据库设计需要两张表:帐户信息表(bank)存放帐户的信息,交易信息表(transInfo)存放每次的交易信息。
上述结果有什么错误?您一定发现了,当张三取钱200元时,虽然交易信息表(transInfo)中保存了取钱200元的交易信息,但帐户表(bank)中的余额仍是1000,没有自动跟随修改。
显然,我们应该根据交易类型是“支取”还是“存入”,自动减少或增加帐户表中的余额。
而且,它还应该具有事务的特征:一旦交易失败,余额修改也应该自动取消。
那么,如何解决呢?这种特殊的业务规则使用普通约束行吗?答案显然是否定的。
使用事务行吗?事务能保证一旦交易失败,余额修改也自动取消。
但实现不了自动修改的触发功能。
所以,最优的解决方案就是采用触发器。
触发器它是一种特殊的存储过程,并且也具有事务的功能,它能在多表之间执行特殊的业务规则或保持复杂的数据逻辑关系。
什么是触发器再看一个例子:目前有两张表,分别存放在职员工和退休员工的信息。
假定现赵二退休:赵二将从员工表中删除。
一旦删除赵二的信息,应自动触发一个动作:将赵二的信息保存到退休员工表中。
强调:自动触发,而不是手动,如何实现呢,当然是使用触发器。
❑触发器是在对表进行插入、更新或删除操作时自动执行的存储过程❑触发器通常用于强制业务规则❑触发器是一种高级约束,可以定义比用CHECK 约束更为复杂的约束❑可执行复杂的SQL语句(if/while/case)❑可引用其它表中的列❑触发器定义在特定的表上,与表相关❑自动触发执行❑不像存储过程,不需要也不能人工调用执行❑本身就是一个事务,所以,如果发现有错误,可以回滚撤销操作。
触发器的类型INSERT触发器:当向表中插入数据时触发,自动执行触发器所定义的SQL语句。
UPDATE触发器:当更新表中某列多列时触发,自动执行触发器所定义的SQL语句。
触发器的使用创建
实验报告
使用Transact-SQL语言中的CREATE TRIGGER命令也可以创建DML触发器:
CREATE TRIGGER [ schema_name . ]trigger_name ON { table | view }
[ WITH <dml_trigger_option> [ ,...n ] ]{ FOR | AFTER | INSTEAD OF } { [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] }
AS { sql_statement [ ; ] [ ,...n ] }
<dml_trigger_option> ::=[ ENCRYPTION ] [ EXECUTE AS Clause ]
schema_name:DML触发器所属架构的名称。
trigger_name:触发器的名称。
table | view:对其执行DML触发器的表或视图。
在SQL Server管理控制台中,展开指定的服务器和数据库,选择指定的数据库和表,单击要查看的表,单击其中的“触发器”文件夹,此时会在右侧的“摘要”窗口中看到此表中的所有触发器,右击某个触发器名称,从弹出的快捷菜单中选择“修改”选项,在打开的窗口中可以查看到定义触发器的语句,在窗口中也可以直接修改触发器的定义。
没有相关权限的用户不能修改数据库表中的数据。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
执行wh_emp触发器
当在管理表中插入记录如(’WH2’,’P2’,’E1) 时,则触发wh_emp触发器,从inserted中向 @wh,@emp赋值,@wh=‘WH2’,@emp=‘E1’ 由于EXISTS为真,即E1既在WH2工作,又在 WH1工作,违反了一名职工仅在一个仓库工作 的语义,所以触发器将执行回滚!
/*创建对职工表插入记录触发器,验证参照的仓库号 是否合法*/
create trigger e_ins_trigger3 on 职工 for insert as if exists (select * from 仓库 where 仓库号 =(select 仓库号 from inserted )) begin print '合法仓库号!' end if not exists (select * from 仓库 where 仓库号 =(select 仓库号 from inserted )) begin print '非法仓库号!' rollback transaction end /*对职工表插入记录,验证参照的仓库号是否合法*/ insert into 职工 values('WH2','E8',1220); insert into 职工 values('WH1','E9',1210); insert into 职工 values('WH22','E88',1220); insert into 职工 values('WH12','E98',1210);
1.插入一个新的供应商元组。
存储过程: CREATE PROCEDURE ins_sup (@sno CHAR(3),@sname CHAR (16),@addr CHAR (10)) AS INSERT INTO 供应商 VALUES(@sno,@sname,@addr) IF @@ERROR = 0 RETURN 0 ELSE RETURN -1 执行: exec ins_sup aaa, bbbbbb, ccc
• 假设有如下关系模式: 管理(仓库号,设备号,职工号) • 它所包含的语义是: – 一个仓库可以有多个职工; – 一名职工仅在一个仓库工作; – 在每个仓库一种设备仅由一名职工保管(但每名职工可 以保管多种设备)。 • 显然该关系模式的关键字是(仓库号,设备号)。进一步假设, 该关系中已经有元组: ('WH1','P1','E1') ('WH1','P2','E1') • 现在接着要插入元组('WH2','P2','E1'),注意:这种操作显然 违反了语义“一名职工仅在一个仓库工作”,但它不违反实 体完整性约束,一般的域完整性约束也无济于事。这时则只 能通过触发器来实现数据完整性约束。
提示:需要在订货数据库中首先建立管理表
参考答案
/*创建插入仓库记录触发器,发生插入时输出’插入 了一个仓库元组’*/
create trigger wh_trigger on 仓库 for insert as print '插入了一个仓库元组'
/*为验证触发器对仓库表插入一条记录*/ insert into 仓库 values('WH5','北京',1370); insert into 仓库 values('WH6','上海',1500); insert into 仓库 values('WH7','广州',1200); insert into 仓库 values('WH8','武汉',1400);
一个简单的插入触发器。
CREATE TRIGGER wh_trigger
ON 仓库 FOR INSERT AS PRINT '插入了一个仓库元组'
当对仓库表插入一条记录时,会输出‘插入了一
个仓库元组’。
定义一个触发器,当删除仓库表的记录时,同时将在 该仓库工作的所有职工,在职工表中,将这些职工的 仓库号字段值置为空值NULL: CREATE TRIGGER w_del_trigger ON 仓库 FOR DELETE AS
/*变更职工所属仓库的仓库号验证更新职工触发器-不存在的仓库号*/ use 订货 update 职工 set 仓库号='WH8' where 职工号='E7'
/*创建插入、更新管理表记录触发器,该触发器将拒 绝一名职工在多个仓库工作*/
create trigger wh_emp on 管理 for insert update as declare @emp char(5),@wh char(5) select @wh=仓库号,@emp=职工号 from inserted if exists (select * from 管理 where 职工号 =@emp AND 仓库号 <>@wh) begin raiserror ('该职工已属于其它仓库!',16,1) rollback transaction end
/*创建删除仓库记录触发器,当执行时,将对应的职工表记录其 仓库号被更新为NULL*/
create trigger w_del_trigger on 仓库 for delete as update 职工 set 仓库号 =null where 仓库号 in(select 仓库号 from deleted ) begin print '合法仓库号!对应的职工表记录其仓库号被更新为NULL' End /*删除仓库记录验证触发器数据例子*/ use 订货 delete from dbo.仓库 where 仓库号 = 'WH1'
更新触发器:变更职工所属仓库的仓库号时, CREATE TRIGGER e_upd_trigger 检查所参照的仓库元组是否存在.若不存在, ON 职工 FOR UPDATE 则撤消所做的更新,若新的仓库号是WH2, AS DECLARE @wh_no CHAR(4) 则将职工工资提高10% IF UPDATE(仓库号) BEGIN IF (SELECT COUNT(*) FROM 仓库 w , inserted i WHERE w.仓库号 = i.仓库号) = 0 BEGIN RAISERROR ('非法仓库号!', 16, 1) ROLLBACK TRANSACTION END ELSE BEGIN SELECT @wh_no = 仓库号 FROM inserted IF @wh_no = 'WH2' UPDATE 职工 SET 工资 = 工资*1.10 WHERE 职工号 = (SELECT 职工号 FROM inserted) END END
为订货数据库的订购单关系建立插入触发器
CREATE TRIGGER ord_ins_trigger ON 订购单 FOR INSERT AS IF ((SELECT COUNT(*) FROM 职工 e,INSERTED i WHERE e.职工号=i.职工号)=0 OR (SELECT COUNT(*) FROM 供应商 s,INSERTED i WHERE s.供应商号=i. 供应商号)=0) BEGIN RAISERROR ('非法职工号或非法供应商号', 1, 1) ROLLBACK TRANSACTIO,使得当插入职工记 录时,检查相应的仓库元组是否存在,如果不存在则撤消 所做的插入操作。
解2.
CREATE TRIGGER e_ins_trigger ON 职工 FOR INSERT AS IF (SELECT COUNT(*) FROM 仓库 w , inserted i WHERE w.仓库号 = i.仓库号) = 0 BEGIN RAISERROR ('非法仓库号!',1,1) ROLLBACK TRANSACTION END
UPDATE 职工
SET 仓库号=NULL
存放刚删除的旧记录 的删除视图
WHERE 仓库号 = (SELECT 仓库号 FROM deleted)
对职工表的插入操作定义一个触发器,使得当插入职工记 录时,检查相应的仓库元组是否存在,如果不存在则撤消 所做的插入操作。
解1.
CREATE TRIGGER e_ins_trigger ON 职工 FOR INSERT AS IF NOT EXISTS (SELECT * FROM 仓库 WHERE 仓库号 = (SELECT 仓库号 FROM inserted i )) BEGIN RAISERROR ('非法仓库号!',1,1) ROLLBACK TRANSACTION END
建立触发器
CREATE TRIGGER wh_emp ON 管理 FOR INSERT,UPDATE AS DECLARE @emp CHAR(6),@wh CHAR(6) SELECT @wh=仓库号,@emp=职工号 FROM inserted IF EXISTS(SELECT * FROM 管理 WHERE 职工号=@emp AND 仓库号<>@wh) BEGIN RAISERROR ('该职工已经属于其他仓库!', 16, 1) ROLLBACK TRANSACTION END
对职工表的更新操作定义一个触发器,使得 当职工变换所属仓库时,检查相应的仓库元 组是否存在,如果不存在则撤消所做的更新 操作,如果新的仓库号是WH2则将工资提高 10%。
CREATE TRIGGER e_upd_trigger ON 职工 FOR UPDATE AS DECLARE @wh_no CHAR(4) IF UPDATE(仓库号) BEGIN IF (SELECT COUNT(*) FROM 仓库 w , inserted i WHERE w.仓库号 = i.仓库号) = 0 BEGIN RAISERROR ('非法仓库号!', 16, 1) ROLLBACK TRANSACTION END ELSE BEGIN SELECT @wh_no = 仓库号 FROM inserted IF @wh_no = 'WH2' UPDATE 职工 SET 工资 = 工资*1.10 WHERE 职工号 = (SELECT 职工号 FROM inserted) END END