数据库触发器的应用实例

数据库触发器的应用实例
数据库触发器的应用实例

8.5 数据库触发器的应用举例

例1:创建一个DML语句级触发器,当对emp表执行INSERT, UPDATE, DELETE 操作时,它自动更新dept_summary 表中的数据。由于在PL/SQL块中不能直接调用DDL语句,所以,利用ORACLE内置包DBMS_UTILITY中的EXEC_DDL_STATEMENT过程,由它执行DDL语句创建触发器。

CREATE TABLE dept_summary(

Deptno NUMBER(2),

Sal_sum NUMBER(9, 2),

Emp_count NUMBER);

INSERT INTO dept_summary(deptno, sal_sum, emp_count)

SELECT deptno, SUM(sal), COUNT(*)

FROM emp

GROUP BY deptno;

--创建一个PL/SQL过程disp_dept_summary

--在触发器中调用该过程显示dept_summary标中的数据。

CREATE OR REPLACE PROCEDURE disp_dept_summary

IS

Rec dept_summary%ROWTYPE;

CURSOR c1 IS SELECT * FROM dept_summary;

BEGIN

OPEN c1;

FETCH c1 INTO REC;

DBMS_OUTPUT.PUT_LINE('deptno sal_sum emp_count');

DBMS_OUTPUT.PUT_LINE('-------------------------------------');

WHILE c1%FOUND LOOP

DBMS_OUTPUT.PUT_LINE(RPAD(rec.deptno, 6)||

To_char(rec.sal_sum, '$999,999.99')||

LPAD(rec.emp_count, 13));

FETCH c1 INTO rec;

END LOOP;

CLOSE c1;

END;

BEGIN

DBMS_OUTPUT.PUT_LINE('插入前');

Disp_dept_summary();

DBMS_UTILITY.EXEC_DDL_STATEMENT('

CREATE OR REPLACE TRIGGER trig1

AFTER INSERT OR DELETE OR UPDATE OF sal ON emp

BEGIN

DBMS_OUTPUT.PUT_LINE(''正在执行trig1 触发器…'');

DELETE FROM dept_summary;

INSERT INTO dept_summary(deptno, sal_sum, emp_count)

SELECT deptno, SUM(sal), COUNT(*)

FROM emp GROUP BY deptno;

END;

');

INSERT INTO dept(deptno, dname, loc)

V ALUES(90, ‘demo_dept’, ‘none_loc’);

INSERT INTO emp(ename, deptno, empno, sal)

V ALUES(USER, 90, 9999, 3000);

DBMS_OUTPUT.PUT_LINE('插入后');

Disp_dept_summary();

UPDATE emp SET sal=1000 WHERE empno=9999;

DBMS_OUTPUT.PUT_LINE('修改后');

Disp_dept_summary();

DELETE FROM emp WHERE empno=9999;

DELETE FROM dept WHERE deptno=90;

DBMS_OUTPUT.PUT_LINE('删除后');

Disp_dept_summary();

DBMS_UTILITY.EXEC_DDL_STATEMENT(‘DROP TRIGGER trig1’);

EXCEPTION

WHEN OTHERS THEN

DBMS_OUTPUT.PUT_LINE(SQLCODE||'---'||SQLERRM);

END;

例2:创建DML语句行级触发器。当对emp表执行INSERT, UPDATE, DELETE 操作时,它自动更新dept_summary 表中的数据。由于在PL/SQL块中不能直接调用DDL语句,所以,利用ORACLE内置包DBMS_UTILITY中的EXEC_DDL_STATEMENT过程,由它执行DDL语句创建触发器。

BEGIN

DBMS_OUTPUT.PUT_LINE('插入前');

Disp_dept_summary();

DBMS_UTILITY.EXEC_DDL_STATEMENT(

'CREATE OR REPLACE TRIGGER trig2_update

AFTER UPDATE OF sal ON emp

REFERENCING OLD AS old_emp NEW AS new_emp

FOR EACH ROW

数据库完整性

一、实验目的 1.熟悉通过SQL对数据进行完整性控制。 2.完成上机习题。 二、实验平台 RDBMS及其交互查询工具。KingbaseES的查询分析器 三、实验内容和要求 使用SQL对数据进行完整性控制(3类完整性、CHEC短语、CONSTRAINT子句、触发器)。用实验证实,当操作违反完整性约束条件时,系统是如何处理的。 实验内容及完成情况: 在本实验中,对数据库完整性进行上机练习。包括3类完整性:CHECK语句、CONSTRAINT子句、触发器。首先在数据库中建立3张表:student、course、SC。 (一)实体完整性 定义表的主码:单个属性构成的码可以用列级约束条件也可以用表级约束条件;多属性构成的码只能用表级约束条件。(1)定义表student,并将其中的主码定义为sno。 (sno char (7) primary key, sname char(8) not null , ssex char(2),sage smallint, sdept char(20)); (在列级定义主码)

(2)定义表SC,并将其中的属性sno、cno定义为主码。create table SC( sno char(7) not null, cno char(4) not null, grade smallint,primary key(sno,cno)); 实体完整性检验和违约处理: 其中,sno为主码,不能重复键入,否则如上列所示,重复键入‘25005’,则拒绝插入或者修改。而其他属性的重复则无影响,如下图所示:其中主码为‘25005’和‘25006’的元组其属性均相同,但是可以插入成功!

施密特触发器工作原理

使用CMOS集成电路需注意的几个问题 集成电路按晶体管的性质分为TTL和CMOS两大类,TTL以速度见长,CMOS以功耗低而著称,其中CMOS电路以其优良的特性成为目前应用最广泛的集成电路。在电子制作中使用CMOS集成电路时,除了认真阅读产品说明或有关资料,了解其引脚分布及极限参数外,还应注意以下几个问题: 1、电源问题 (1)CMOS集成电路的工作电压一般在3-18V,但当应用电路中有门电路的模拟应用(如脉冲振荡、线性放大)时,最低电压则不应低于4.5V。由于CMOS集成电路工作电压宽,故使用不稳压的电源电路CMOS集成电路也可以正常工作,但是工作在不同电源电压的器件,其输出阻抗、工作速度和功耗是不相同的,在使用中一定要注意。 (2)CMOS集成电路的电源电压必须在规定围,不能超压,也不能反接。因为在制造过程中,自然形成许多寄生二极管,如图1所示为反相器电路,在正常电压下,这些二极管皆处于反偏,对逻辑功能无影响,但是由于这些寄生二极管的存在,一旦电源电压过高或电压极性接反,就会使电路产生损坏。 2、驱动能力问题 CMOS电路的驱动能力的提高,除选用驱动能力较强的缓冲器来完成之外,还可将同一个芯片几个同类电路并联起来提高,这时驱动能力提高到N倍(N为并联门的数量)。如图2所示。 3、输入端的问题 (1)多余输入端的处理。CMOS电路的输入端不允许悬空,因为悬空会使电位不定,破坏正常的逻辑关系。另外,悬空时输入阻抗高,易受外界噪声干扰,使电路产生误动作,而且也极易造成栅极感应静电而击穿。所以“与”门,“与非”门的多余输入端要接高电平,“或”门和“或非”门的多余输入端要接低电平。若电路的工作速度不高,功耗也不需特别考虑时,则可以将多余输入端与使用端并联。 (2)输入端接长导线时的保护。在应用中有时输入端需要接长的导线,而长输入线必然有较大的分布电容和分布电感,易形成LC振荡,特别当输入端一旦发生负电压,极易破坏CMOS中的保护二极管。其保护办法为在输入端处接一个电阻,如图3所示,R=VDD/1mA。 (3)输入端的静电防护。虽然各种CMOS输入端有抗静电的保护措施,但仍需小心对待,在存储和运输中最好用金属容器或者导电材料包装,不要放在易产生静电高压的化工材料或化纤织物中。组装、调试时,工具、仪表、工作台等均应良好接地。要防止操作人员的静电干扰造成的损坏,如不宜穿尼龙、化纤衣服,手或工具在接触集成块前最好先接一下地。对器件引线矫直弯曲或人工焊接时,使用的设备必须良好接地。 (4)输入信号的上升和下降时间不易过长,否则一方面容易造成虚假触发而导致器件失去正常功能,另一方面还会造成大的损耗。对于74HC系列限于0.5us以。若不满足此要求,需用施密特触发器件进行输入整形,整形电路如图4所示。 (5)CMOS电路具有很高的输入阻抗,致使器件易受外界干扰、冲击和静电击穿,所以为了保护CMOS管的氧化层不被击穿,一般在其部输入端接有二极管保护电路,如图5所示。 其中R约为1.5-2.5KΩ。输入保护网络的引入使器件的输入阻抗有一定下降,但仍在108Ω以上。这样也给电路的应用带来了一些限制: (A)输入电路的过流保护。CMOS电路输入端的保护二极管,其导通时电流容限一般为1mA在可能出现过大瞬态输入电流(超过10mA)时,应串接输入保护电阻。例如,当输入端接的信号,其阻很小、或引线很长、或输入电容较大时,在接通和关断电源时,就容易产生较大的瞬态输入电流,这时必须接输入保护电阻,若VDD=10V,则取限流电阻为10KΩ即可。 (B)输入信号必须在VDD到VSS之间,以防二极管因正向偏置电流过大而烧坏。因此在

SQL Server2008触发器学习笔记

触发器 一﹕触发器是一种特殊的存储过程﹐它不能被显式地调用﹐而是在往表中插入记录﹑更新记录或者删除记录时被自动地激活。所以触发器可以用来实现对表实施复杂的完整性约束。 二﹕SQL Server为每个触发器都创建了两个专用表﹕Inserted表和Deleted表。这两个表由系统来维护﹐它们存在于内存中而不是在数据库中。这两个表的结构总是与被该触发器作用的表的结构相同。触发器执行完成后﹐与该触发器相关的这两个表也被删除。Deleted表存放由于执行Delete或Update语句而要从表中删除的所有行。Inserted表存放由于执行Insert或Update语句而要向表中插入的所有行。 三﹕Instead of 和After触发器 SQL Server提供了两种触发器﹕Instead of 和After 触发器。 这两种触发器的差别在于他们被激活的操作﹕ Instead of触发器用于替代引起触发器执行的T-SQL语句。除表之外﹐Instead of 触发器也可以用于视图﹐用来扩展视图可以支持的更新操作。 After触发器在一个Insert,Update或Deleted语句之后执行﹐进行约束检查等动作都在After 触发器被激活之前发生。After触发器只能用于表。一个表或视图的每一个修改动作(insert,update和delete)都可以有一个instead of 触发器﹐一个表的每个修改动作都可以有多个After触发器。 INSTEAD OF触发器被用于更新那些没有办法通过正常方式更新的视图。通常不能在一个基于连接的视图上进行DELETE操作,可以编写一个INSTEAD OF DELETE触发器来实现删除。可以访问那些如果视图是一个真正的表时已经被删除的数据行,它将把删除的行存储在deleted临时表中。 本次练习将通过具体的例子介绍如何使用INSTEAD OF触发器,使读者掌握INSTEAD OF 触发器的使用方法。 向student表中插入数据时,检查学号是否存在于student表中,如存在则进行插入操作,否则就不插入,具体语句如下所示: CREATE TRIGGER [checkid] ON dbo.student INSTEAD OF insert AS IF NOT EXISTS(SELECT * FROM dbo.student WHERE ID=(SELECT ID FROM INSERTED)) BEGIN ROLLBACK TRANSACTION PRINT '要处理记录的学号不存在!' END ELSE BEGIN INSERT NTO dbo.student select * from inserted

数据库实验 完整性 索引 触发器

实验五实验报告 二、实验内容 5.1 实体完整性 1)在数据库School中建立表Stu_Union,进行主键约束,在没有违反实体完整性的前提下插入并更新一条记录 建立表Stu_Union,进行主键约束 在没有违反实体完整性的前提下插入一条记录 在没有违反实体完整性的前提下更新一条记录

2)演示违反实体完整性的插入操作 3)演示违反实体完整性的更新操作 4)演示事务的处理,包括事务的建立,处理以及出错时的事务回滚,演示事务处理和批处理

的区别。 提示:SQL2005相关语句为 BEGIN TRAN ROLLBACK TRAN COMMIT TRAN 可以这样演示:新建一个包含两条语句的事务,使第一条成功而第二条失败,然后查看整个事务是否回滚。 重要提示:SQL默认只回滚出错的语句,要回滚整个事务,需要预先执行以下语句:SET XACT_ABORT ON a.先执行如下SQL语句(可执行成功) b.再执行如下语句,此时为执行第一句insert语句成功,第二句insert语句失败

c.查询事物是否回滚 由上可知,表为b步骤即事物出错前的状态,所以整个事物回滚。 5)通过建立Scholarship表,插入一些数据。演示当与现有的数据环境不等时,无法建立实体完整性以及参照完整性。

提示:即演示不能为表Scholarship生成主键和外键的情况。 a. b. 不能为表Scholarship生成主键

c.不能为表Scholarship生成外键 5.2参照完整性 1)为演示参照完整性,建立表Course,令cno为其主键,并在Stu_Union中插入数据。为下面的实验步骤做预先准备。 在Stu_Union中插入数据

SQL触发器基本教程

一、创建一个简单的触发器 触发器是一种特殊的存储过程,类似于事件函数,SQL Server? 允许为INSERT、UPDATE、DELETE 创建触发器,即当在表中插入、更新、删除记录时,触发一个或一系列T-SQL语句。触发器可以在查询分析器里创建,也可以在表名上点右键->“所有任务”->“管理触发器”来创建,不过都是要写T-SQL 语句的,只是在查询分析器里要先确定当前操作的数据库。 创建触发器用CREATE TRIGGER CREATE TRIGGER 触发器名称 ON 表名 FOR I NSERT、UPDATE 或DELETE AS T-SQL 语句 注意:触发器名称是不加引号的。 如下是联机丛书上的一个示例,当在titles 表上更改记录时,发送邮件通知MaryM。CREATE TRIGGER reminder ON titles FOR INSERT, UPDATE, DELETE AS EXEC master..xp_sendmail 'MaryM', 'Don''t forget to print a report for the distributors.' 二、删除触发器 用查询分析器删除 在查询分析器中使用drop trigger 触发器名称来删除触发器。 也可以同时删除多个触发器:drop trigger 触发器名称,触发器名称... 注意:触发器名称是不加引号的。在删除触发器之前可以先看一下触发器是否存在: if Exists(select name from sysobjects where name=触发器名称and xtype='TR') 用企业管理器删除 在企业管理器中,在表上点右键->“所有任务”->“管理触发器”,选中所要删除的触发器,然后点击“删除”。 三、重命名触发器 用查询分析器重命名 exec sp_rename 原名称, 新名称 sp_rename 是SQL Server? 自带的一个存储过程,用于更改当前数据库中用户创建的对象的名称,如表名、列表、索引名等。

mysql触发器异常处理

MySQL触发器异常处理 MySQL触发器更新本表数据异常:Can't update table 'tbl' in stored function/trigger because it is already used by statement which invoked this 如果你在触发器里面对刚刚插入的数据进行了 insert/update, 则出现这个问题。因为会造 成循环的调用. create trigger test before update on test for each row update test set NEW.updateTime = NOW() where id=NEW.ID; END 应该使用set操作,而不是在触发器里使用 update,比如 create trigger test before update on test for each row set NEW.updateTime = NOW(); END MySQL触发器执行复合语句 触发器1.自增表中商品分类编码值+1,添加商品分类前给商品分类编码属性赋其对应的自 增表中的值 CREATE TRIGGER trigger1 BEFORE INSERT ON dw_base_commodity_category_info FOR EACH ROW BEGIN UPDATE sequence SET current_value=current_value+1 WHERE `name`='dw_base_commodity_category_info'; SET NEW.code=(SELECT current_value FROM sequence WHERE `name`='dw_base_commodity_category_info'); END; 删除触发器1:DROP TRIGGER trigger1; 触发器2.自增表中商品编码值+1,添加商品前给商品编码属性赋其对应的自增表中的值 CREATE TRIGGER trigger2 BEFORE INSERT ON dw_commodity_fact_info

施密特触发器的特性和应用

施密特触发器的特性和应用 施密特触发器也有两个稳定状态,但与一般触发器不同的是,施密特触发器采用电位触发方式,其状态由输入信号电位维持;对于负向递减和正向递增两种不同变化方向的输入信号,施密特触发器有不同的阀值电压。见图6-2: 解释:当输入信号Vi减小至低于负向阀值V-时,输出电压Vo翻转为高电平Vo H;而输入信号Vi增大至高于正向阀值V+时,输出电压Vo才翻转为低电平VoL。这种滞后的电压传输特性称回差特性,其值V+-V-称为回差电压。 一、用555定时器构成的施密特触发器 1.电路组成: 将555定时器的阀值输入端Vi1(6脚)、触发输入端Vi2(2脚)相连作为输入端Vi,由Vo(3脚)或Vo’(7脚)挂接上拉电阻Rl及电源VDD作为输出端,便构成了如图6-3所示的施密特触发器电路。

2.工作原理: 如图所示,输入信号Vi,对应的输出信号为Vo,假设未接控制输入Vm 。 ①当Vi=0V时,即Vi1<2/3Vcc、Vi2<1/3Vcc,此时Vo=1。以后Vi逐渐上升,只要不高于阀值电压(2/3Vcc),输出Vo维持1不变。 ②当Vi上升至高于阀值电压(2/3Vcc)时,则Vi1>2/3Vcc、Vi2>1/3Vcc,此时定时器状态翻转为0,输出Vo=0,此后Vi继续上升,然后下降,只要不低于触发电位(1/3Vcc),输出维持0不变。 ③当Vi继续下降,一旦低于触发电位(1/3Vcc)后,Vi1<2/3Vcc、Vi2<1/3V cc,定时器状态翻转为1,输出Vo=1。 总结:未考虑外接控制输入Vm时,正负向阀值电压 V+=2/3Vcc、V- =1/3Vcc,回差电压△V=1/3Vcc。若考虑Vm,则正负向阀值电压V+=Vm、V-=1/2Vm,回差电压△V=1/2Vm。由此,通过调节外加电压Vm可改变施密特触发器的回差电压特性,从而改变输出脉冲的宽度。 二、施密特触发器的应用举例 1.波形变换: 施密特触发器可用以将模拟信号波形转换成矩形波,如图6-4所示将正弦波信号同相转换成矩形波的例子,输出脉冲宽度tpo可通过回差电压加以调节。

SQL触发器全过程(含实例讲解)

SQL触发器全过程 第一、概述 一:触发器是一种特殊的存储过程,它不能被显式地调用,而是在往表中插入记录﹑更新记录或者删除记录时被自动地激活。所以触发器可以用来实现对表实施复杂的完整性约`束。 二: SQL Server为每个触发器都创建了两个专用表:Inserted表和Deleted 表。这两个表由系统来维护,它们存在于内存中而不是在数据库中。这两个表的结构总是与被该触发器作用的表的结构相同。触发器执行完成后,与该触发器相关的这两个表也被删除。 Deleted表存放由于执行Delete或Update语句而要从表中删除的所有行。 Inserted表存放由于执行Insert或Update语句而要向表中插入的所有行。 三:instead of 和 After触发器 SQL Server2000提供了两种触发器:Instead of 和After 触发器。这两种触发器的差别在于他们被激活的同: Instead of触发器用于替代引起触发器执行的T-SQL语句。除表之外,Instead of 触发器也可以用于视图,用来扩展视图可以支持的更新操作。 After触发器在一个Insert,Update或Deleted语句之后执行,进行约束检查等动作都在After触发器被激活之前发生。After触发器只能用于表。

一个表或视图的每一个修改动作(insert,update和delete)都可以有一个instead of 触发器,一个表的每个修改动作都可以有多个After触发器。 四:触发器的执行过程 如果一个Insert﹑update或者delete语句违反了约束,那幺After触发器不会执行,因为对约束的检查是在After触发器被激动之前发生的。所以After 触发器不能超越约束。 Instead of 触发器可以取代激发它的操作来执行。它在Inserted表和Deleted表刚刚建立,其它任何操作还没有发生时被执行。因为Instead of 触发器在约束之前执行,所以它可以对约束进行一些预处理。 五:使用T-SQL语句来创建触发器 基本语句如下: create trigger trigger_name on {table_name | view_name} {for | After | Instead of } [ insert, update,delete ] as sql_statement

mysql设置触发器权限问题的解决方法

本文实例讲述了mysql设置触发器权限的方法,针对权限错误的情况非常实用。具体分析如下: mysql导入数据提示没有super privilege权限处理,如下所示: 1 error 1419 (hy000): you do not have the super privilege and binary logging is enabled 导入function 、trigger 到mysql database,报错: 1 you do not have the super privilege and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)”. 原因: function / trigger 中有dangerous statements修改数据库,错误只在启用binary logging选项进行主从复制的服务器上出现。 解决方法如下: 1)导入数据的用户不仅需要create routine, alter routine, create trigger, alter trigger, create function 和alter function 权限,还需要super privileges 权限,使用超级用户导入数据。 2)让所有用户具有执行类似functions的权限,危险,不推荐, 123 o by specifying it on the server start, like: –log-bin-trust-function-creators=1 o by setting it to 1 through the set global statement, like: mysql> set global log_bin_trust_function_creators = 1; 3)如果不需要复制,或者是从库,关闭binlog, 1234 # binary logging –not required for slaves, but recommended #log-bin=mysql-bin # binary logging format –mixed recommended #binlog_format=mixed 希望本文所述对大家的mysql数据库设计有所帮助。 更多信息请查看IT技术专栏

数据完整性与触发器关系解析

8.2 触发器 触发器是一种特殊类型的存储过程。触发器不同于前面介绍过的存储过程,它主要 是通过事件触发而被执行的,而存储过程可以通过存储过程名称被直接调用。触发器是 一个功能强大的工具,它使每个站点可以在有数据更改时自动强制执行其业务规则。触 发器可以用于sQL5ffver约束、默认值和规则的完整性检查。触发器依存于表的数据 库对象,在表执行修改操作(插入/更新/删除)时自动执行,即通过事件进行触发而被执行。 ………..触发器是一种特殊类型的存储过程,不由用户直接调用。创建触发器时会对其进行定义,以便在对特定表或列作特定类型的数据修改时执行。 CREATE PROCEDURE 或CREATE TRIGGER 语句不能跨越批处理。即存储过程或触发器始终只能在一个批处理中创建并编译到一个执行计划中。 用触发器还可以强制执行业务规则 Microsoft® SQL Server? 2000 提供了两种主要机制来强制业务规则和数据完整性:约束和触发器。触发器是一种特殊类型的存储过程,它在指定的表中的数据发生变化时自动生效。唤醒调用触发器以响应INSERT、UPDATE 或DELETE 语句。触发器可以查询其它表,并可以包含复杂的Transact-SQL 语句。将触发器和触发它的语句作为可在触发器内回滚的单个事务对待。如果检测到严重错误(例如,磁盘空间不足),则整个事务即自动回滚。 触发器的优点如下: 触发器可通过数据库中的相关表实现级联更改;不过,通过级联引用完整性约束可以更有效地执行这些更改。 触发器可以强制比用CHECK 约束定义的约束更为复杂的约束。 与CHECK 约束不同,触发器可以引用其它表中的列。例如,触发器可以使用另一个表中的SELECT 比较插入或更新的数据,以及执行其它操作,如修改数据或显示用户定义错误信息。 触发器也可以评估数据修改前后的表状态,并根据其差异采取对策。 一个表中的多个同类触发器(INSERT、UPDATE 或DELETE)允许采取多个不同的对策以响应同一个修改语句。 比较触发器与约束 约束和触发器在特殊情况下各有优势。触发器的主要好处在于它们可以包含使用

SQL触发器实例讲解

SQL触发器实例讲解 SQL 资料2009-07-23 14:44:07 阅读6072 评论9 字号:大中小订阅 定义:何为触发器?在SQL Serv er里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序。触发器是一个特殊的存储过程。 常见的触发器有三种:分别应用于Insert , Update , Delete 事件。 我为什么要使用触发器?比如,这么两个表: Create Table Student( --学生表 StudentID int primary key, --学号 .... ) Create Table BorrowRecord( --学生借书记录表 BorrowRecord int identity(1,1), --流水号 StudentID int , --学号 BorrowDate datetime, --借出时间 ReturnDAte Datetime, --归还时间 ... ) 用到的功能有: 1.如果我更改了学生的学号,我希望他的借书记录仍然与这个学生相关(也就是同时更改借书记录表的学号); 2.如果该学生已经毕业,我希望删除他的学号的同时,也删除它的借书记录。 等等。 这时候可以用到触发器。对于1,创建一个Update触发器: Create Trigger truStudent On Student --在Student表中创建触发器 f or Update --为什么事件触发 As --事件触发后所要做的事情 if Update(StudentID) begin Update BorrowRecord Set StudentID=i.StudentID From BorrowRecord br , Deleted d ,Inserted i --Deleted和Inserted临时表 Where br.StudentID=d.StudentID end

MySQL触发器

MySQL 5.0 触发器 MySQL 5.0 新特性系列 C 第 2 部分 MySQL 技术白皮书 Peter Gulutzan March, 2005 翻译:陈朋奕 毕业于西安电子科技大学 现泛华讯电脑技术 版权说明版权说明::本手册参考之原文本手册参考之原文的版权属的版权属 MySQL AB,而本手册可自由使用而本手册可自由使用、、修改修改、、散发散发、、转载和商业用途转载和商业用途,, 但必须保留译者署名但必须保留译者署名。。由此引发的版权问题由此引发的版权问题,,译者不负责任译者不负责任。。(btw :可能会有错别字或错误可能会有错别字或错误,,但不影响阅读但不影响阅读)) Cop yright 2005, MySQL AB

Table of Contents Introduction (3) Conventions and Styles (3) Why Triggers (3) 1. Syntax: Name (4) 2. Syntax: Time (5) 3. Syntax: Event (5) 4. Syntax: Table (5) 5. Syntax: Granularity (5) 6. Syntax: Statement (6) Privileges (6) Referring to OLD and NEW columns (6) Example of CREATE and INSERT (7) Example of a "check" constraint (7) Conclusion (9) About MySQL (9) Copyri ght 2005, MySQL AB Page 2

5数据完整性课后习题

习题 一、选择题 1.一个表上可以建立多个名称不同、类型各异的触发器,每个触发器可以由三个动作来引发,但是每个触发器最多只能作用于()个表上。 A.一 B.二 C.三 D.四 2.激活触发器的数据修改语句,有效选项是()。 A.INSERT B.UPDATE C.DELETE D.SELECT 3.创建触发器不需要指定的选项有()。 A.触发器的名称 B.在其上定义触发器的表 C.触发器将何时触发 D.执行触发操作的编程语句 4.当希望执行对Book表的操作时,如果该操作不执行,而是执行对PRICE 表的更新操作,则应该创建什么类型的DML 触发器()。 A.FOR B.BEFORE C.AFTER D.INSTEAD OF 5.在DML触发器工作中,有可能生成的两个内存表是()。 A.INSERTED, DELETED B.UPDATED, INSERTED C.DELETED,ADDED D.ADDED, DELETED 6.关于触发器叙述正确的是()。 A.触发器是自动执行的,可以在一定条件下触发 B.触发器不可以同步数据库的相关表进行级联更改 C.SQL Server 2008不支持DDL触发器 D.触发器不属于存储过程 7.关于约束叙述正确的是()。 A.每个约束只能作用与一个列上 B.每个约束可以作用多个列,但是必须在一个表里 C.每个约束可以作用到多个表的多个列 D.以上都不对 8.用户定义的约束,是属于()完整性。 A.用户自定义 B.实体

C.参照 D.都不是 9.下述SQL命令的短语中,定义属性上约束条件的是()。 A.NOT NULL短语 B.UNIQUE短语 C.CHECK短语 D.HA VING短语 10.下列()是对触发器的描述 A.定义了一个有相关列和行的集合 B.当用户修改数据时,一种特殊形式的存储过程被自动执行 C.SQL语句的预编译集合 D.它根据一或多列的值,提供对数据库表的行的快速访问 二、填空题 1.数据库的实体完整性要求表中所有行唯一,可通过建主码、唯一约束、唯一索引、IDENTITY标识等约束来实现。 2.数据库域完整性可保证表中指定字段中数据的正确性。要求表中指定列的数据具有正确的数据类型、格式和有效取植范围。 3.关系完整性包括实体完整性、值域完整性、参照完整性_和用户自定义完整性。4.当指定基本表中某一列或若干列为主码时,则系统将在这些列上自动建立一个非空_______、_唯一__约束和___聚集__的索引。 5. SQL Server 2008中的触发器可以分为_DML_触发器和__DDL__触发器两种。 6.在SQL Server中,通过执行 CRETAE RULE 语句创建约束,使用 SP_bindrule 存储过程绑定约束,使用 SP_unbindrule 解除绑定,使用 DROP RULE 删除规则。 7.数据库的完整性是指数据的___正确性_____ 和___相容性_____。 8.数据库完整性的定义一般由SQL的___ DDL _____语句来实现。它们作为数据库模式的一部分存入数据字典中。 9.触发器按激活的方式分为After 和Instead Of 两种触发方式。后触发器在记录已经改变完之后被激活。替代触发器在记录变更之前被激活。 10.创建触发器使用 CRETAE TRIGGER 语句。在表或视图上执行INSERT 、UPDATE 和DELETE 语句可以激活触发器。 11.SQL Server为每一个触发器创建了两个inserted 和deleted 临时表。在触发器触发时时候创建,在触发器的工作完成之后时候删除。 三、问答题 1.试述关系模型的完整性规则。在参照完整性中,为什么外码属性的值也可以为空?什么情况下才可以为空? 解答: 关系模型的完整性规则是对关系的某种约束条件。关系模型中可以有三类完整性约束:实体完整性、参照完整性和用户定义的完整性。其中实体完整性和参照完整性是关系模型必须满足的完整性约束条件,被称作是关系的两个不变性,应该由关系系统自动支持。1) 实体完整性规则:若属性A是基本关系R的主属性,则属性A不能取空值。2)参照完整性规则:若属性(或属性组)F是基本关系R的外码,它与基本关系S的主码Ks相对应(基本关系R和S不一定是不同的关系),则对于R中每个元组在F上的值必须为:等于S中某个元组的主码值或者取空值(F的每个属性值均为空值);3)用户定义的完整性是针对某一具体关系数据库的约束条件。它反映某一具体应用所涉及的数据必须满足的语义要求。在

数据库存储器与触发器实验报告

南昌航空大学实验报告 二0 一七年5月 3 日 课程名称:数据库概论实验名称:存储器与触发器 班级: XX 姓名:XXX 同组人: X 指导教师评定:签名: 一、实验环境 1. Windows2000或以上版本; 2. SQLServer2000 或2005。 二、实验目的 1. 掌握存储过程的创建,修改,使用,删除; 2. 掌握触发器的创建,修改,使用,删除。 三、实验步骤及参考源代码 1.创建过程代码: CREATEPROCEDURE_P_Proc( @ccna varchar (10), @cnochar(4) OUTPUT@cnavarchar (10) OUTPUT@Pna varchar (20) OUTPUTSnumint OUTPUT AS SELECT@cna=cna, @cn(=cp. eno, @pnapna, @numnum FROMtp , customer, paper WHEREustomer . eno=cp. eno ANRaper . pno=cp. pno ANDcna =@ccna

6.执行存储过程C_P_Pro,实现对李涛,钱金浩等不同顾客的订阅信息 查询 execute C_P_Proc @nam=e' 李涛' execute C_P_Proc @nam=e' 钱金浩' 7,删除存储过程C_P_Prcc DROPPROCEDURCE_P_PROC (4)在DingBao数据库中针对PAPEF创建插入触发器TR_PAPER_I删除触发器TR_PAPER_D修改触发器TR_PAPER。具体要求如下。 <1>对PAPER勺插入触发器:插入报纸记录,单价为负值或为空时,设定为10 元。 CREATE TRIGGER TR_PAPER_I ON paper FOR INSERT AS DECLARE @ippr FLOAT; declare @ipno int; SELECT @ippr=ppr,@ipno=pno from inserted begin if @ippr<0 or @ippr is NULL begin raiserror(' 报纸的单价为空或小于零!',16,1)

mysql 触发器使用实例

mysql 触发器使用实例(修改一个表内容的同时另一个表内容自动变化) [分享]触发器小例子 触发器能进行一些约束. 这是个小例子,当Student表的StudentID列被发生更改时,BorrowStudent表的StudentID列也跟着更改.如果Student表删除某记录,BorrowStudent也删除对应StudentID的记录. /*先删除将要创建而存在的表*/ drop table if exists Student; drop table if exists BorrowStudent; /*创建表*/ create table Student( StudentID int not null primary key, StudentName varchar(30) not null, StudentSex enum('m','f') default 'm' )engine=myisam; create table BorrowStudent( BorrowRecord int not null auto_increment primary key, StudentID int not null, BorrorDate date, ReturnDate date, foreign key(StudentID) references Student(StudentID) )engine=myisam; /*插入记录*/ insert into Student values(1235412,'java','m'); insert into Student values(3214562,'jiajia','m'); insert into Student values(5441253,'purana','f'); insert into BorrowStudent(StudentID,BorrorDate,ReturnDate) values(1235412,'2007-01-01','2007-01-07'); insert into BorrowStudent(StudentID,BorrorDate,ReturnDate)

数据库原理 数据的完整性 实验报告

***大学计算机科学与信息学院软件工程系上机实验报告 《数据库原理》实验报告 题目实验8 数据的 完整性姓名***班级***日期*** 实验环境:SQL Server 2000 一、实验目的 熟悉通过SQL对数据进行完整性控制,通过实验加深对数据完整性的理解。 相关知识 触发器是实施复杂完整性的一种机制。触发器不需要专门的语句调用,当对它所保护数据进行修改时由DBMS自动激活,以防止对数据进行不正确,未授权或不一致的修改。 创建触发器的语法为: CREATE TRIGGER < 触发器> ON <表名> [WITH ENCRYPTION] FOR {[DELETE][,][INSERT][,][UPDATE]} [WITH APPEND] [NOT FOR REPLICATION] AS 其中: 1)WITH ENCRYPTION 为加密选项。 2)DELETE 选项为创建DELETE 触发器。DELETE触发器的作用是当对表执行DELETE操作时触发器被激 活,并从指定表中删除元组,同时将删除的元组放入一个特殊的逻辑表(delete表)中。触发器的动作可以检查delete表中的数据,以确定下一步该如何处理。 3)INSERT选项为创建INSERT触发器。INSERT触发器在对指定表中执行插入数据操作时激活,激活后 将插入表中的数据拷贝并送入一个特殊的逻辑表(inserted 表)中,触发器会根据INSERT表中的

值决定如何处理。 4)UPDATE选项为创建UPDATE触发器。UPDATE触发器仅在对指定表中进行更新数据操作时激活。UPDATE 触发器激活后把将要被更新的原数据移入delete表中,再将要被更新后的新数据的备份送入inserted表中,UPDATE触发器对delete和inserted表进行检查,并决定如何处理。 5)NOT FOR REPLICATION 选项说明当一个复制过程在修改一个触发器表时,与该表相关联的触发器不 能被执行。 一个触发器只适用于一个表,每个表最多只能有三个触发器,它们分别是INSERT、UPDATE和DELETE 触发器。触发器仅在实施数据完整性和处理业务规则时使用。 二、实验内容 本实验的内容为使用SQL对数据进行完整性控制(关系数据库的三类完整性、CHECK短语、CONSTRAINT 子句、触发器)。用实验证实,当操作违反了完整性约束条件时,系统如何处理的。认真完成以下题目,按要求填写实验报告,记录所有实验用例。 (1)打开SQL Server 2000的查询分析器,用DDL语句建立如下三个表。 表student1: 字段名类型长度含义约束 Sno Char 10 学号主码(约束名:STU_PK) Sname Char 20 姓名非空(约束名:STU_U1) Ssex Char 2 性别‘男’或’女’ (约束名:STU_C1) Sage Int 年龄18 到 30(约束名:STU_C2) Sdept Char 10 所在系 表course1: 字段名类型长度含义约束 Cno Char 10 课程号主码(约束名:COU_PK) Cname Char 20 课程名唯一(约束名:COU_C1) Cpno Char 2 先行课 Ccredit Int 学分 表SC1: 字段名类型长度含义约束 Sno Char 10 学号主码(约束名:SC_PK)

施密特触发器和比较器的区别

施密特触发器原理图解详细分析 重要特性:施密特触发器具有如下特性:输入电压有两个阀值VL、VH,VL 施密特触发器通常用作缓冲器消除输入端的干扰。 施密特波形图 施密特触发器也有两个稳定状态,但与一般触发器不同的是,施密特触发器采用电位触发方式,其状态由输入信号电位维持;对于负向递减和正向递增两种不同变化方向的输入信号,施密特触发器有不同的阀值电压。 门电路有一个阈值电压,当输入电压从低电平上升到阈值电压或从高电平下降到阈值电压时电路的状态将发生变化。施密特触发器是一种特殊的门电路,与普通的门电路不同,施密特触发器有两个阈值电压,分别称为正向阈值电压和负向阈值电压。在输入信号从低电平上升到高电平的过程中使电路状态发生变化的输入电压称为正向阈值电压,在输入信号从高电平下降到低电平的过程中使电路状态发生变化的输入电压称为负向阈值电压。正向阈值电压与负向阈值电压之差称为回差电压。 它是一种阈值开关电路,具有突变输入——输出特性的门电路。这种电路被设计成阻止输入电压出现微小变化(低于某一阈值)而引起的输出电压的改变。 利用施密特触发器状态转换过程中的正反馈作用,可以把边沿变化缓慢的周期性信号变换为边沿很陡的矩形脉冲信号。输入的信号只要幅度大于vt+,即可在施密特触发器的输出端得到同等频率的矩形脉冲信号。 当输入电压由低向高增加,到达V+时,输出电压发生突变,而输入电 压Vi由高变低,到达V-,输出电压发生突变,因而出现输出电压变化滞后的现象,可以看出对于要求一定延迟启动的电路,它是特别适用的. 从传感器得到的矩形脉冲经传输后往往发生波形畸变。当传输线上的电容较大时,波形的上升沿将明显变坏;当传输线较长,而且接受端的阻抗与传输

数据库触发器机制的设计与实现

数据库触发器机制的设计与实现 摘要:根据当前数据库应用需求和技术发展现状,研究了数据库管理系统管理系统触发器机制实现的关键技术问题,并以GKD-BaseGKD-Base为原型,在已有的GKD-Base PL/SQL 引擎基础上实现了数据库的触发器功能。关键词: PL/SQL引擎 Rete网络双Hash结构触发器 数据库管理系统作为信息系统的核心部件,在信息化时代所充当的角色是其它任何软件所不能替代的。当前数据库应用的一个普遍要求是数据库管理系统能够在一些数据库相关事件发生时触发预先定义的操作,实现信息管理的自动化,因此引进了触发器机制。触发器可以增强引用完整性,加强复杂业务的规则,或者监控数据库的变动,并执行一定的数据操作。触发器机制实现主要涉及触发事件的检测以及触发条件的判决等关键技术问题,以及对触发器的编译存储和调用执行等具体操作。本文以国产数据库管理系统GKD-Base为原型,在兼容Oracle 规范的PL/SQL引擎基础上,提出一套解决方案,对触发器的关键技术问题进行了探讨,并设计实现了数据库的触发器机制,扩展了数据库管理系统GKD-Base的功能。1 GKD-Base PL/SQL 引擎GKD-BASE数据库是一个具有自主知识产权的数据库管理系统,具有兼容SQL89标准的SQL引擎,能够为用户提供一个统一、有效的数据库访问接口(XAPI),实现对数据库的各种操作。为了融合SQL语言强大的集合数据处理能力处理能力和第三代语言(3GL)灵活的过程处理能力,在GKD-Base上已初步实现了兼容Oarcle PL/SQL V.23的PL/SQL引擎。GKD-Base PL/SQL引擎包括编译器、解释器和异常处理三个模块。在编译阶段,根据PL/SQL语言兼有过程式语句和SQL语句的特点,采取分而治之策略,把过程语句和SQL语句分开处理。对于SQL语句,编译器首先建立SQL语句结点,进行相应的变量绑定和语法检查;检查无误后产生语法树形式的中间代码。对于过程语句,编译器将对语句成分进行语法分析,对声明的变量和数据类型建立相应的符号表,最终产生语法树形式的中间代码。解释器的作用是对编译器生成的中间代码进行解释执行。解释器与编译器对应,具有相对独立的SQL语句解释模块和过程语句解释模块。另外,解释器还包括执行状态堆栈的管理、与GKD-Base SQL引擎的调用接口。异常处理模块主要实现程序运行时的错误检查和报告,并支持用户自定义异常和预定义异常的检查和处理。GKD-Base PL/SQL引擎可以实现对过程式语句、SQL语句与游标、存储子程序及包的编译和解释执行。2 触发器实现的关键问题触发器定义了当某些数据库相关事件发生时数据库应采取的动作。触发器可增强引用完整性,加强复杂业务的规则,或者监控数据库的变动,其实现主要涉及到触发事件的检测以及触发条件的判决等关键技术问题。2.1 触发器的事件检测机制触发器事件检测机制包括对事件的检测和存储,是实现触发器的关键。触发器检测的事件类型比较简单,基本事件主要包括对数据的插入、删除以及更新等。GKD-Base的触发器在对事件检测时,直接在相关事件发生的前后调用检测函数截获并分析事件消息,以确定是否对触发器点火。触发器事件检测机制实现的关键在于对触发事件的存储。触发事件具有时间顺序,因此存储时也必须按照严格的时间顺序进行存储。综合比较各个商用和实验数据库系统的事件表存储机制,选择了Starburst的双的双HASH链表存储机制,如图1。 这里,变迁表分为两种类型:NEW和OLD,分别对应于触发器行级别操作中的NEW值和OLD值。变迁表中存储了事件类型、当前数据表以及事件作用的元组。系统可以通过这个驻留内存的双HASH链表实现数据库变迁的快速定位和跟踪处理。2.2 触发器的条件判决机制触发器的条件判决机制是触发器的核心,根据SQL99标准的定义,可以将触发器分为前触发、约束判定和后触发三种类型。这三种类型触发器的判决顺序策略如图2。 触发器的条件评估是影响触发器机制的最关键因素。在数据库环境中,大多数数据修改行为只能影响数据库的一小部分内容,因此没必要每次都从头开始评估触发器规则条件,Rete

相关文档
最新文档