MYSQL 触发器使用实例

MYSQL 触发器使用实例
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)

values(3214562,'2007-01-01','2007-01-07');

insert into BorrowStudent(StudentID,BorrorDate,ReturnDate)

values(5441253,'2007-01-01','2007-01-07');

/*创建触发器*/

delimiter$$

drop trigger if exists tduStudent$$

drop trigger if exists tddStudent$$

create trigger tduStudent before update

on Student for each row

begin

if new.StudentID!=old.StudentID then

update BorrowStudent

set BorrowStudent.StudentID=new.StudentID

where BorrowStudent.StudentID=old.StudentID;

end if;

end$$

create trigger tddStudent before delete

on Student for each row

begin

delete

from BorrowStudent

where BorrowStudent.StudentID=old.StudentID;

end$$

delimiter;

待完善~

转载于:https://www.360docs.net/doc/ce13638727.html,/u1/50685/showart_1935390.html

下面是在网上找的一个比较好的教程~~供学习

每次我想要演示实际代码时,我会对mysql客户端的屏幕就出现的代码进行调整,将字体改成Courier,使他们看起来与普通文本不一样(让大家区别程序代码和正文)。在这里举个例子:

mysql>DROP FUNCTION f;

Query OK,0rows affected(0.00sec)

如果实例比较大,则需要在某些行和段落间加注释,同时我会用将"<--"符号放在页面的右边以表示强调。例如:

mysql>CREATE PROCEDURE p()

->BEGIN

->/*This procedure does nothing*/<--

->END;//

Query OK,0rows affected(0.00sec)

有时候我会将例子中的"mysql>"和"->"这些系统显示去掉,你可以直接将代码复制到mysql客户端程序中(如果你现在所读的不是电子版的,可以在https://www.360docs.net/doc/ce13638727.html,网站下载相关脚本)所以的例子都已经在Suse9.2Linux、Mysql5.0.3公共版上测试通过。在您阅读本书的时候,Mysql已经有更高的版本,同时能支持更多OS了,包括Windows,Sparc,HP-UX。因此这里的例子将能正常的运行在您的电脑上。但如果运行仍然出现故障,可以咨询你认识的资深Mysql用户,这样就能得到比较好的支持和帮助。

为什么要用触发器

我们在MySQL5.0中包含对触发器的支持是由于以下原因:

MySQL早期版本的用户长期有需要触发器的要求。

我们曾经许诺支持所有ANSI标准的特性。

您可以使用它来检查或预防坏的数据进入数据库。

您可以改变或者取消INSERT,UPDATE以及DELETE语句。

您可以在一个会话中监视数据改变的动作。

在这里我假定大家都读过"MySQL新特性"丛书的第一集--"MySQL存储过程",那么大家都应该知道MySQL至此存储过程和函数,那是很重要的知识,因为在触发器中你可以使用在函数中使用的语句。特别举个例子:

复合语句(BEGIN/END)是合法的.

流控制(Flow-of-control)语句(IF,CASE,WHILE,LOOP,WHILE,REPEAT, LEAVE,ITERATE)也是合法的.

变量声明(DECLARE)以及指派(SET)是合法的.

允许条件声明.

异常处理声明也是允许的.

但是在这里要记住函数有受限条件:不能在函数中访问表.

因此在函数中使用以下语句是非法的。

ALTER'CACHE INDEX'CALL COMMIT CREATE DELETE

DROP'FLUSH PRIVILEGES'GRANT INSERT KILL

LOCK OPTIMIZE REPAIR REPLACE REVOKE

ROLLBACK SAVEPOINT'SELECT FROM table'

'SET system variable''SET TRANSACTION'

SHOW'START TRANSACTION'TRUNCATE UPDATE

在触发器中也有完全一样的限制.

触发器相对而言比较新,因此会有(bugs)缺陷.所以我在这里给大家警告,就像我在存储过程书中所说那样.不要在含有重要数据的数据库中使用这个触发器,如果需要的话在一些以测试为目的的数据库上使用,同时在你对表创建触发器时确认这些数据库是默认的。

语法

1.语法:命名规则

CREATE TRIGGER<触发器名称><--

{BEFORE|AFTER}

{INSERT|UPDATE|DELETE}

ON<表名称>

FOR EACH ROW

<触发器SQL语句>

触发器必须有名字,最多64个字符,可能后面会附有分隔符.它和MySQL中其他对象的命名方式基本相象.

这里我有个习惯:就是用表的名字+'_'+触发器类型的缩写.因此如果是表t26,触发器是在事件UPDATE(参考下面的点(2)和(3))之前(BEFORE)的,那么它的名字就是t26_bu。

2.语法:触发时间

CREATE TRIGGER<触发器名称>

{BEFORE|AFTER}<--

{INSERT|UPDATE|DELETE}

ON<表名称>

FOR EACH ROW

<触发的SQL语句>

触发器有执行的时间设置:可以设置为事件发生前或后。

3.语法:事件

CREATE TRIGGER<触发器名称>

{BEFORE|AFTER}

{INSERT|UPDATE|DELETE}<--

ON<表名称>

FOR EACH ROW

<触发的SQL语句>

同样也能设定触发的事件:它们可以在执行insert、update或delete的过程中触发。

4.语法:表

CREATE TRIGGER<触发器名称>

{BEFORE|AFTER}

{INSERT|UPDATE|DELETE}

ON<表名称><--

FOR EACH ROW

<触发的SQL语句>

触发器是属于某一个表的:当在这个表上执行插入、

更新或删除操作的时候就导致触发器的激活.

我们不能给同一张表的同一个事件安排两个触发器。

5.语法:(步长)触发间隔

CREATE TRIGGER<触发器名称>

{BEFORE|AFTER}

{INSERT|UPDATE|DELETE}

ON<表名称>

FOR EACH ROW<--

<触发的SQL语句>

触发器的执行间隔:FOR EACH ROW子句通知触发器

每隔一行执行一次动作,而不是对整个表执行一次。

6.语法:语句

CREATE TRIGGER<触发器名称>

{BEFORE|AFTER}

{INSERT|UPDATE|DELETE}

ON<表名称>

FOR EACH ROW

<触发的SQL语句><--

触发器包含所要触发的SQL语句:这里的语句可以是任何合法的语句,

包括复合语句,但是这里的语句受的限制和函数的一样。

Privileges权限

你必须拥有相当大的权限才能创建触发器(CREATE TRIGGER)。

如果你已经是Root用户,那么就足够了。这跟SQL的标准有所不同。

因此在下一个版本的MySQL中,

你完全有可能看到有一种叫做CREATE TRIGGER的新权限。

然后通过这样的方法赋予:

GRANT CREATE TRIGGER ON<表名称>TO<用户或用户列表>;

也可以通过这样收回权限:

REVOKE CREATE TRIGGER ON<表名称>FROM<用户或用户列表>;

关于旧的和新创建的列的标识

在触发器的SQL语句中,你可以关联表中的任意列。但你不能仅使用列的名称去标识,那会使系统混淆,因为那里可能会有列的新名(这可能正是你要修改的,你的动作可能正是要修改列名),还有列的旧名存在。因此你必须用这样的语法来标识:"NEW.column_name"或者"OLD. column_name".这样在技术上处理(NEW|OLD.column_name)新和旧的列名属于创建了过渡变量("transition variables")。

对于INSERT语句,只有NEW是合法的;对于DELETE语句,只有OLD才合法;而UPDATE 语句可以在和NEW以及OLD同时使用。下面是一个UPDATE中同时使用NEW和OLD的例子。

CREATE TRIGGER t21_au

BEFORE UPDATE ON t22

FOR EACH ROW

BEGIN

SET@old=OLD.s1;

SET@new=NEW.s1;

END;//

现在如果t21表中的s1列的值是55,那么执行了

"UPDATE t21SET s1=s1+1"之后@old的值会变成55,

而@new的值将会变成56。

Example of CREATE and INSERT CREATE和INSERT的例子

创建有触发器的表

这里所有的例程中我都假定大家的分隔符已经设置成//(DELIMITER//)。CREATE TABLE t22(s1INTEGER)//

CREATE TRIGGER t22_bi

BEFORE INSERT ON t22

FOR EACH ROW

BEGIN

SET@x='Trigger was activated!';

SET NEW.s1=55;

END;//

在最开始我创建了一个名字为t22的表,然后在表t22上创建了一个触发器t22_bi,当我们要向表中的行插入时,触发器就会被激活,执行将s1列的值改为55的动作。

使用触发器执行插入动作

mysql>INSERT INTO t22VALUES(1)//

让我们看如果向表t2中插入一行数据触发器对应的表会怎么样?这里的插入的动作是很常见的,我们不需要触发器的权限来执行它。甚至不需要知道是否有触发器关联。

mysql>SELECT@x,t22.*FROM t22//

+------------------------+------+

|@x|s1|

+------------------------+------+

|Trigger was activated!|55|

+------------------------+------+

1row in set(0.00sec)

大家可以看到INSERT动作之后的结果,和我们预期的一样,x标记被改动了,同时这里插入的数据不是我们开始输入的插入数据,而是触发器自己的数据。

"check"完整性约束例子

什么是"check"约束

在标准的SQL语言中,我们可以在(CREATE TABLE)创建表的过程中使用"CHECK (condition)",

例如:

CREATE TABLE t25

(s1INT,s2CHAR(5),PRIMARY KEY(s1),

CHECK(LEFT(s2,1)='A'))

ENGINE=INNODB;

这里CHECK的意思是"当s2列的最左边的字符不是'A'时,insert和update语句都会非法",MySQL的视图不支持CHECK,我个人是很希望它能支持的。但如果你很需要在表中使用这样的功能,我建议大家使用触发器来实现。

CREATE TABLE t25

(s1INT,s2CHAR(5),

PRIMARY KEY(s1))

ENGINE=INNODB//

CREATE TRIGGER t25_bi

BEFORE INSERT ON t25

FOR EACH ROW

IF LEFT(NEW.s2,1)<>'A'THEN SET NEW.s1=0;END IF;//

CREATE TRIGGER t25_bu

BEFORE UPDATE ON t25

FOR EACH ROW

IF LEFT(NEW.s2,1)<>'A'THEN SET NEW.s1=0;END IF;//

我只需要使用BEFORE INSERT和BEFORE UPDATE语句就行了,删除了触发器不会对表有影响,同时AFTER的触发器也不能修改NEW的过程变量(transition variables)。为了激活触发器,我执行了向表中的行插入s1=0的数据,之后只要执行符合LEFT(s2,1)<>'A'条件的动作都会失败:

INSERT INTO t25VALUES(0,'a')/*priming the pump*///

INSERT INTO t25VALUES(5,'b')/*gets error'23000'*///

Don't Believe The Old MySQL Manual

该抛弃旧的MySQL的手册了

我在这里警告大家不要相信过去的MySQL手册中所说的了。我们已经去掉了关于触发器的错误的语句,但是仍旧有很多旧版本的手册在网上,举个例子,这是一个德国的Url上的:

https://www.360docs.net/doc/ce13638727.html,/doc/mysql/de/ANSI_diff_Triggers.html.这个手册上说触发器就是存储过程,忘掉吧,你也已经看见了,触发器就是触发器,而存储过程还是存储过程。手册上还说触发器可以从其他表上来删除,或者是当你删除一个事务的时候激发,无论他说的是什么意思,忘掉吧,MySQL不会去实现这些的。最后关于说使用触发器会对查询速度产生影响的说法也是错的,触发器不会对查询产生任何影响。

phpmyadmin里好像只支持一部分mysql数据存储过程,因此在MySQL Query Brower和cmd 命令行输入能通过!!

数据库原理课程设计报告报告实验创建存储过程与触发器

存储过程与触发器实验日期和时间: 2016 年 5 月13 日、星 期 五第节 实验室:DJ2-信息管理实验室 班级:学号:姓名: 实验环境: 1.硬件:笔记本电脑 2.软件:SQL Server 2012 实验原理: 存储过程概念:存储过程是事先编好的,存储在数据库中的一组被编译了的T-SQL命令集合,这些命令用来完成对数据库的指定操作。存储过程可以接受用户的输入参数、向客户端返回表格或标量结果和消息、调用数据定义语言(DDL)和数据操作语言(DML)语句,然后返回输入参数。 触发器概念:触发器(trigger)是SQL server 提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( insert,delete, update)时就会激活它执行。触发器经常用于加强数据的完整性约束和业务规则等。 实验任务: 此作业成绩得分根据你完成的任务的难度和数量评分,完成后在实验室给老师演示验收,课后提交电子版报告。如额外完成自拟题目应当事先将所拟题目提交给老师或在报告中明确标注题意。 假定有学校的图书馆管理信息系统,可以用于日常管理书库和同学们的借还书工作。 以下列出参考的库表情况: 根据管理的业务需求来分析,该管理信息系统的数据库应至少包括如下数据表:(打★号的是必须有的表) 1.★图书现有库存表。作用:记录图书的现有库存情况。至少包括:书号、书名、 作者、简介、类别、价格、出版社、出版日期、现有库存数量、最小库存量、库 存总量、库存位置等。 2.★读者信息表。作用:记录读者信息。至少包括:读者编号、证件类型、证件号 码、姓名、性别、职业(可填写教师、学生、教工、其它……)、所属单位、地址、 联系电话等。 3.★借书记录表。作用:记录借书情况,以及是否归还。至少包括:借阅ID(主键, 可设置为自动编号)、书号、读者编号、借阅数量、借阅日期、是否归还、管理员 编号……等。 4.★还书记录表。作用:记录还书情况。至少包括:还书ID(主键,可设置为自动 编号)、书号、读者编号、归还数量、归还日期、是否超期(超过假设45天为超 期)、超期天数、管理员编号……等。(附:为简化操作,续借可视为归还后再借)。 5.管理员信息表。作用:记录负责管理书库和借书还书工作的管理员信息。至少包 括:管理员编号、职工编号(在职工档案表中的职工编号)、用户名、密码、管理

数据库原理实验报告S11-数据库触发器的创建

实验11 数据库触发器的建立 实验日期和时间:2014.11.28 实验室:软件工程室 班级:12计科3 学号:20124122 姓名:张翔 实验环境: 1.硬件:内存4.00GB 处理器 2.50Hz 2.软件:Windows 7旗舰版Microsoft SQL Server 2005 实验原理: 1.理解触发器的概念、和一般存储过程的区别、触发器的优点和使用原则。 2.掌握触发器的创建、执行、查看、修改和删除方法。 一、触发器的概念: 触发器是一种特殊类型的存储过程。一般的存储过程通过存储过程名称被直接调用,而触发器主要是通过当某个事件发生时自动被触发执行的。触发器可以用于SQL Server约束、默认值和规则的完整性检查,还可以完成难以用普通约束实现的复杂功能。 当创建数据库对象或在数据表中插入记录、修改记录或者删除记录时,SQL Server就会自动执行触发器所定义的SQL语句,从而确保对数据的处理必须符合由这些SQL语句所定义的规则。触发器和引起触发器执行的SQL语句被当作一次事务处理,如果这次事务未获得成功,SQL Server会自动返回该事务执行前的状态。 使用触发器有以下优点: ?触发器是自动的执行的,。 ?触发器可以通过数据库中的相关表进行层叠更改,如可以在“学生表”中的学号列上创建一个删除触发器,当删除“学生表”的记录时,自动级联删除“成绩表”中的个匹配行。 ?触发器可以强制限制。这些限制比用CHECK约束所定义的更复杂,与CHECK约束不同的是,触发器可以引用其他表中的列。 触发器可以分为DML触发器和DDL触发器两种 ?DDL触发器用于响应各种数据定义语言(DDL) 事件。这些事件主要对应于Transact-SQL 中的CREATE、ALTER 和DROP 语句,以及执行类似DDL 操作的某些系统存储过程。它们用于执行管理任务,并强制影响数据库的业务规则。 ?DML触发器是在用户使用数据操作语言(DML) 事件编辑数据时发生。DML 事件是针对表或视图的INSERT、UPDATE 或DELETE 语句。DML触发器有助于在表或视图中修改数据时强制业务规则,扩展数据完整性。 DML触发器又分为AFTER触发器和INSTEAD OF触发器两种: ?AFTER触发器:这种类型的触发器将在数据变动(INSERT、UPDA TE和DELETE 操作)完成以后才被触发。可以对变动的数据进行检查,如果发现错误,将拒绝接受或回滚变动的数据。AFTER触发器只能在表上定义。在同一个数据表中可以创建多个AFTER触发器。 ?INSTEAD OF触发器:INSTEAD OF触发器将在数据变动以前被触发,并取代变动数据的操作,而去执行触发器定义的操作。INSTEAD OF触发器可以在表或视图上定义。每个INSERT、UPDATE和DELETE语句最多定义一个INSTEAD OF触发器。 二、创建触发器

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

数据库系统实验报告 触发器

实验4 触发器 1、通过序列和触发器实现借阅表中借阅流水号字段的自动递增。 Create or replace sequence bwnum_id Minvalue 1 Maxvalue 1.0E28 Start with 1 Increment by 1 Cache 20; Create or Replace Trigger tri_bwnum_id Before Insert On borrow For Each Row Begin Select bwnum_id.Nextval Into :new.bwnum From DUAL; End;

2、通过序列和触发器实现预约表中预约流水号字段的自动递增 Create sequence pnum_id Minvalue 1 Maxvalue 1.0E28 Start with 1 Increment by 1 Cache 20; Create or Replace Trigger tri_pnum_id Before Insert On preborrow For Each Row Begin Select pnum_id.Nextval Into :new.pnum From DUAL; End;

3、修改实验三借书功能的存储过程。 该存储过程要求: (1)借书时输入借书证号,图书编号。(即该函数有2个输入参数) (2)借书时,借书日期为系统时间。 *该存储过程主体部分只有insert into语句。 create or replace Procedure p_borrow (P_BNUM IN BORROW.BNUM%TYPE, P_RNUM IN BORROW.RNUM%TYPE) as begin insert into BORROW (BNUM,RNUM,BDATE) values(P_BNUM,P_RNUM,TO_CHAR(SYSDATE(),'YY/MM/DD')); commit; end; 4、建立与借书存储过程相对应的触发器,当借阅表中加入借阅信息时,该触发器触发,自动修改所借图书的是否借出改为‘是’。 Create or Replace Trigger tri_borrow_insert

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技术专栏

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

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)

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

数据库触发器机制的设计与实现 摘要:根据当前数据库应用需求和技术发展现状,研究了数据库管理系统管理系统触发器机制实现的关键技术问题,并以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

数据库原理游标及触发器实验

《数据库原理》实验报告要求 报告的主要内容 一、实验目的 根据各实验项目的实验目的撰写,具体在附件中给出。 二、实验环境 操作系统:Windows XP,数据库管理系统(DBMS):SQL Server2008 三、实验要求 根据各实验项目要求撰写,具体在附件中给出。 四、实验内容及完成情况 自己所完成的内容,进行了哪些操作、编写了哪些程序及执行后的结果,包括一些错误结果及解决办法等。 五、实验体会 具体要求 1、 本实验属综合性实验,要使用学校统一的报告纸,附加纸张要 挟在报告纸内并左侧装订; 2、 报告纸的封面要填写完整,项目要与实验日历中的项目完全一 致,否则将返回重写; 3、 报告第四项“实验内容及完成情况”中,只允许对操作结果和 程序运行结果进行打印,其余内容必须用钢笔或水性笔书写, 报告要整洁; 4、 严禁出现雷同报告,如果出现雷同,雷同报告的所有学生本次实 验将作不及格或最低分处理。如果出现不及格实验项目将取消考 试资格。

实验目的及要求 实验三、存储过程及游标 实验目的: 综合运用程序设计和数据结构,使用游标完成具有较完整功能的存储过程。 实验要求: 根据所给的excel表格,完成实验内容。 说明:“招生表”中部分属性保存的是代码值,请按所给代码表完成如下要求。 1.使用SQL语句创建数据库,并在数据库中完成表的创建。(报告中要分析各个表的主键和外键是什么) 创建数据库studentManage

2.写一个存储过程,功能是查询所有招生信息。使用游标完成逐行输出,每行要有行号。(在查询结果中,要求各类代码要替换成具体的文字信息,例如:政治面貌不要显示“01”,而要显示“中共党员”。)

数据库建立触发器

江西理工大学应用科学学院 数据库技术及应用实验报告 实验名称SQL数据库存储过程及触发器的创建 日期2012、4、2 专业班级电子商务091班 实验人阳东学号40号 实验要求: 1、用T-SQL语言创建名为查看课程成绩的存储过程: 输入任一课程名,则显示课程、编号、名称、教师编号、学生的学号以及 对应课程成绩。 2、用T-SQL语言创建触发器: 当对表插入数据时,性别只为男or女,否则弹出错误提示框。 实验目的: 学会使用T-SQL语言创建数据库存储过程以及触发器。 实验内容及步骤: 一、创建存储过程: 1、启动SQL Server企业管理器。 2、在“控制台根目录”窗口左边窗格中,展开“SQL Server组”→“数据库” 结点,然后建立“英才大学信息管理系统”数据库。 3、在数据库中建立相应的表“课程名、成绩表”,并在两个表中键入相应的 内容。 4、选择“朱虹美”数据库,然后点击工具中的“SQL查询分析器”菜单命令 ,进入“查询分析器”窗口。 5、在“查询分析器”窗口,输入并执行如下命令: CREATE PROC 查看课程成绩@课程名char(12) AS SELECT 课程.课程编号,课程.课程名称,课程.教师编号,成绩.学号,成绩.成绩 FROM 课程INNER JOIN 成绩ON 课程.课程编号=成绩.课程编号 WHERE 课程.课程名称=@课程名 结果如图所示: 然后再次进入“查询分析器”窗口,执行存储过程,有三种方法: 1)EXEC 查看课程成绩@课程名='软件工程' 2)EXEC 查看课程成绩数据库原理

3) Declare @X char(12) EXEC @X=查看课程成绩'程序设计' 二、创建触发器。 1、启动SQL Server企业管理器。 2、在“控制台根目录”窗口左边窗格中,展开“SQL Server组”→“数据库” 结点,点击“英才大学信息管理系统”数据库。 3、在数据库中建立相应的表“学生”,并在表中键入相应的内容。 4、选择“英才大学信息管理系统”数据库,然后点击工具中的“SQL查询分析器” 菜单命令进入“查询分析器”窗口。 5、在“查询分析器”窗口,输入并执行如下命令: CREATE TRIGGER Trigger_学生_性别ON 学生 FOR INSERT AS IF EXISTS(SELECT*FROM 学生WHERE 性别NOT IN('男','女')) BEGIN RAISERROR('请输入合法的姓名!',16,1) ROLLBACK TRANSACTION END 建立触发器完毕。 然后在表中添加不符合规格的数据,则显示错误提示框:

数据库触发器的分类和区别

Oracle触发器的分类和使用 摘要:在Oracle中,触发器是一种特殊的存储过程,它在发生某种数据库事件时由Oracle 系统自动触发。触发器通常用于加强数据的完整性约束和业务规则等,对于表来说,触发器可以实现比CHECK约束更为复杂的约束。本文介绍了Oracle触发器的概念,功能,优缺点,组成等方面。详细解读了Oracle触发器在各方面的应用并配合相关实例。 关键字:Oracle、触发器、介绍、应用 一、触发器的介绍 1.1 触发器的概念 在Oracle中,触发器是一种特殊的存储过程,它在发生某种数据库事件时由Oracle系统自动触发发器,通常用于加强数据的完整性约束和业务规则等。 触发器与存储过程的区别在于:存储过程是由用户或应用程序显式调用的,而触发器是不能被直接调用的,而是由一个事件来启动运行。即触发器是当某个时间发生时自动地隐式运行。 1.2 触发器的功能 ●允许/限制对表的修改 ●自动生成派生列,比如自增字段 ●强制数据一致性 ●提供审计和日志记录 ●防止无效的事务处理 ●启用复杂的业务逻辑 1.3 触发器的优缺点 优点:触发器可通过数据库中的相关表实现级联更改,不过,通过级联引用完整性约束可以更有效地执行这些更改。触发器可以强制比用CHECK 约束定义的约束更为复杂的约束。与CHECK 约束不同,触发器可以引用其它表中的列。例如,触发器可以使用另一个表中的SELECT 比较插入或更新的数据,以及执行其它操作,如修改数据或显示用户定义错误信息。触发器也可以评估数据修改前后的表状态,并根据其差异采取对策。一个表中的多个同类触发器(INSERT、UPDA TE 或DELETE)允许采取多个不同的对策以响应同一个修改语句。 缺点:触发器功能强大,轻松可靠地实现许多复杂的功能,但是它也具有一些缺点那就是由于我们的滥用会造成数据库及应用程序的维护困难。在数据库操作中,我们可以通过关系、触发器、存储过程、应用程序等来实现数据操作。同时规则、约束、缺省值也是保证数据完整性的重要保障。如果我们对触发器过分的依赖,势必影响数据库的结构,同时增加了维护的复杂程序。 1.4 触发器的组成

mysql触发器实例附答案

触发器和常用函数 第一部分:触发器 概念题 1触发器的含义和作用 实践题 在product表上创建三个触发器。每次激活触发器后,都会更新operate表。product表和operate表的内容如下 按照下列要求进行操作 1 在product表上分别创建BEFORE INSERT、AFTER UPDATE和AFTER DELETE 3个触发器,触发器名称分别为product_bf_insert、product_af_update和product_af_del。执行语句部分都是向operate表插入操作方法和操作时间。 2 对product表分别执行INSERT、UPDATE和DELETE操作 3 删除product_bf_insert和product_af_update这两个触发器 执行步骤 1.创建product表和operate表 2.创建product_bf_insert触发器 3.创建product_af_update触发器 4.创建product_af_del触发器 5.对product表进行操作 6.删除触发器

第二部分:MySQL常用函数 文本函数 数字函数

日期和时间函数

概念题 触发器是由INSERT、UPDATE和DELETE等事件来触发某种特定操作。 满足触发器的触发条件时,数据库系统就会执行触发器中定义的程序语句。这样做可以保证某些操作的一致性。 实践题 1 CREATE TABLE product( id INT(10) NOT NULL UNIQUE PRIMARY KEY, name V ARCHAR(20) NOT NULL, function V ARCHAR(50), company V ARCHAR(20) NOT NULL, address V ARCHAR(50) ); CREATE TABLE operate( op_id INT(10) NOT NULL UNIQUE PRIMARY KEY AUTO_INCREMENT, op_name V ARCHAR(20) NOT NULL, op_time TIME NOT NULL, ); 2 CREATE TRIGGER product_bf_insert BEFORE INSERT ON poduct FOR EACH ROW INSERT INTO operate V ALUES(null,’Insert product’,now()); SELECT * FROM information_schema.triggers WHERE TRIGGER_NAME=’product_bf_insert ’ \G* (查看触发器product_bf_insert基本信息) 3 CREATE TRIGGER product_af_update AFTER UPDA TE ON product FOR EACH ROW INSERT INTO operate V ALUES(null,’Update product’,now()); 4 CREATE TRIGGER product_af_del AFTER DELETE ON product FOR EACH ROW INSERT INTO operate V ALUES(null,’delete product’,now()); 5 INSERT INTO product V ALUES(1,’abc’,’治疗感冒’,’北京abc制药厂’,’北京市昌平区’); SELECT * FROM operate; UPDATE product SET address=’北京市海淀区’ WHERE id=1; SELECT * FROM operate; DELETE FROM product WHERE id=1; SELECT * FROM operate; 6 DROP TRIGGER product_bf_insert; DROP TRIGGER product_af_update;

mysql触发器语法的使用

mysql触发器语法的使用 一、触发器简介触发器(trigger)是个特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作(insert,delete,update)时就会激活它执行。触发器经常用于加强数据的完整性约束和业务规则等。触发器可以从DBA_TRIGGERS ,USER_TRIGGERS 数据字典中查到。通俗的来说触发器,从字面来理解,一触即发的一个器,简称触发器(哈哈,个人理解),举个例子吧,好比天黑了,你开灯了,你看到东西了。你放炮仗,点燃了,一会就炸了。 触发器有一个非常好的特性就是:触发器可以禁止或回滚违反引用完整性的更改,从而取消所尝试的数据修改。二、触发器语法代码如下 CREATE TRIGGER trigger_name trigger_TIme trigger_event ON tbl_name FOR EACH ROW trigger_stmt 触发程序是与表有关的命名数据库对象,当表上出现特定事件时,将激活该对象。 触发程序与命名为tbl_name的表相关。tbl_name必须引用永久性表。不能将触发程序与TEMPORARY表或视图关联起来。 trigger_TIme是触发程序的动作时间。它可以是BEFORE或AFTER,以指明触发程序是在激活它的语句之前或之后触发。 trigger_event指明了激活触发程序的语句的类型。trigger_event可以是下述值之一:INSERT:将新行插入表时激活触发程序,例如,通过INSERT、LOAD DATA和REPLACE 语句。 UPDATE:更改某一行时激活触发程序,例如,通过UPDATE语句。 DELETE:从表中删除某一行时激活触发程序,例如,通过DELETE和REPLACE语句。请注意,trigger_event与以表操作方式激活触发程序的SQL语句并不很类似,这点很重要。例如,关于INSERT的BEFORE触发程序不仅能被INSERT语句激活,也能被LOAD DATA 语句激活。 可能会造成混淆的例子之一是INSERT INTO 。. ON DUPLICATE UPDATE 。..语法:

MySQL触发器在电子商城系统中的应用

龙源期刊网 https://www.360docs.net/doc/ce13638727.html, MySQL触发器在电子商城系统中的应用 作者:张吉力 来源:《电脑知识与技术》2013年第30期 摘要:触发器是一种特殊的存储过程,主要通过事件触发从而执行。通过一个订单与库存管理的案例,详细阐述了insert、delete 、update触发器的特性及在电子商城系统中的应用。 关键词:触发器;insert;delete;update;电子商城系统 中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2013)30-6923-03 触发器是由insert、delete和update等事件来触发某种特定操作。满足触发器的触发条件时,数据库系统就会执行触发器中定义的程序语句。这样做可以保证某些操作之间的一致性。例如,当学生表中增加了一个学生的信息时,学生的总数就必须同时改变。可以在这里创建一个触发器,每次增加一个学生的记录,就执行一次计算学生总数的操作。这样就可以保证每次增加学生的记录后,学生总数是与记录数是一致的。触发器的主要应用场合如下: 1)当向一张表中添加、删除或修改记录时,在相关表中需要进行同步操作。比如,当某客户订购商品,可以在生成订单时通过设计触发器自动将订单所购的库存量相应减少。 2)当表中某字段数据与其他表中数据有关联时。比如,某客户利用信用卡进行消费,可以在其刷卡时通过设计触发器来判断本次消费金额累加后是否超过了卡的最大透支额度。 3)当对某张表需要进行实时跟踪时。比如,当某客户成功订购某商品后,此时可以在订单表上设计触发器来通知相关人员进行及时处理。 1 使用触发器 1.1 创建触发器基本语法 其中触发器名可由程序员自行指定;触发时间可以是before或after,以指明触发程序是在激活它的语句之前或之后触发;触发事件指明了激活触发程序语句的类型,它的值可以是insert、delete、update其中之一;建立触发器的表名用来标识是在哪张表上创建的触发器;FOR EACH ROW表示任何一条记录上的操作满足触发事件都会触发该触发器。执行语句是当触发程序激活时执行的语句。不难发现,触发器必须满足以下四要素,监视地点、监视事件、监视时间和触发事件。 1.2 触发器执行多行语句

MySql数据库触发器学年论文

数学与计算科学学院学年论文(课程设计) 题目触发器在MySQL数据库中的应用 姓名吴碧青 学号1309401050 专业年级2013级信息与计算科学 指导教师李玉梅副教授 2015年12 月10 日

学年论文(课程设计)成绩评定表

触发器在MySQL数据库中的应用 摘 要 触发器是SQL server提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表的事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发。我们这篇文章中提到的是三个基本触发器的相关应用,当我们对一个表进行操作插入、更新、删除时来然后去激活它执行。 在本文中阐述了三种常见的触发器:insert触发器、delete触发器、update 触发器,而这三种触发器是在MySQL数据库中的应用的比较广泛,实用性也很强。这三种触发器都可以查询其他表,也可以包含复杂SQL语句。它们主要用于强制服从复杂的业务规则或要求。我们可以利用这三个触发器来改变一些数据库表中的数据,比如:当教师的底薪升高了,而我们需要改变教师表和工资表中底薪我们就可以用触发器来实现同时把两个表中的信息修改到自己想要的值。 关键词 触发器、insert触发器、delete触发器、update触发器 Application of trigger in MySQL database Abstract The trigger is a way to ensure data integrity by server SQL, which is a special storage process associated with a table event. It is not a program call, nor a manual, but an event. The relevant application of the three basic triggers, when we use a table to insert, update, delete, and then activate it. In this paper, three kinds of common triggers are described in this paper: insert, delete, update, and these three kinds of flip flops are widely used in MySQL database. These three triggers can query other tables, also can contain complex SQL statements. They are mainly used to enforce compliance with complex business rules or requirements. We can change some database table data, using the three triggers such as: when the teacher's salary has increased, and we need to change the teachers' salary and wage table table we can use triggers to implement the two tables in the information you want to modify the value. Key words Trigger、insert Trigger、delete Trigger、update Trigger

Mysql触发器中执行一个外部程序

Mysql触发器中执行一个外部程序 昨天接到一个需求,要求在mysql的触发器中执行一个外部程序。 一开始没有什么头绪,后来发现嘿嘿。 https://www.360docs.net/doc/ce13638727.html,/projects/project.php?id=211 有个叫mysqludf的一个东西,用起来还不错。 https://www.360docs.net/doc/ce13638727.html,/lib_mysqludf_sys/index.php 不过这个东西仅仅在linux下试了试,效果还行。 步骤如下: 一、解压附件的压缩包之后 如果不想自己编译的话,把lib_mysqludf_sys.so文件放到mysql的 lib/mysql/plugin/ 目录下。 二、执行chcon -t texrel_shlib_t mysql/lib/mysql/plugin/lib_mysqludf_sys.so 三、创建函数 DROP FUNCTION IF EXISTS lib_mysqludf_sys_info; DROP FUNCTION IF EXISTS sys_get; DROP FUNCTION IF EXISTS sys_set; DROP FUNCTION IF EXISTS sys_exec; DROP FUNCTION IF EXISTS sys_eval; CREATE FUNCTION lib_mysqludf_sys_info RETURNS string SONAME 'lib_mysqludf_sys.so'; CREATE FUNCTION sys_get RETURNS string SONAME 'lib_mysqludf_sys.so'; CREATE FUNCTION sys_set RETURNS int SONAME 'lib_mysqludf_sys.so'; CREATE FUNCTION sys_exec RETURNS int SONAME 'lib_mysqludf_sys.so'; CREATE FUNCTION sys_eval RETURNS string SONAME 'lib_mysqludf_sys.so'; 四、测试

MYSQL触发器教程

约定和编程风格 每次我想要演示实际代码时,我会对mysql客户端的屏幕就出现的代码进行调整,将字体改成Courier,使他们看起来与普通文本不一样(让大家区别程序代码和正文)。在这里举个例子: mysql> DROP FUNCTION f; Query OK, 0 rows affected (0.00 sec) 如果实例比较大,则需要在某些行和段落间加注释,同时我会用将"<--"符号放在页面的右边以表示强调。例如: mysql> CREATE PROCEDURE p () -> BEGIN -> /* This procedure does nothing */ <-- -> END;// Query OK, 0 rows affected (0.00 sec) 有时候我会将例子中的"mysql>"和"->"这些系统显示去掉,你可以直接将代码复制到mysql 客户端程序中(如果你现在所读的不是电子版的,可以在https://www.360docs.net/doc/ce13638727.html,网站下载相关脚本)所以的例子都已经在Suse 9.2 Linux、Mysql 5.0.3公共版上测试通过。在您阅读本书的时候,Mysql已经有更高的版本,同时能支持更多OS了,包括Windows,Sparc,HP-UX。因此这里的例子将能正常的运行在您的电脑上。但如果运行仍然出现故障,可以咨询你认识的资深Mysql用户,这样就能得到比较好的支持和帮助。 为什么要用触发器 我们在MySQL 5.0中包含对触发器的支持是由于以下原因: MySQL早期版本的用户长期有需要触发器的要求。 我们曾经许诺支持所有ANSI标准的特性。 您可以使用它来检查或预防坏的数据进入数据库。 您可以改变或者取消INSERT, UPDATE以及DELETE语句。 您可以在一个会话中监视数据改变的动作。

相关文档
最新文档