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

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

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

昨天接到一个需求,要求在mysql的触发器中执行一个外部程序。

一开始没有什么头绪,后来发现嘿嘿。

https://www.360docs.net/doc/8412797359.html,/projects/project.php?id=211

有个叫mysqludf的一个东西,用起来还不错。

https://www.360docs.net/doc/8412797359.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';

四、测试

1、准备sh文件

在linux系统中执行下面的命令

su mysql

mkdir /mysqlUDFtest

cd mysqlUDFtest

vi test.sh

#/bin/sh

date > testlog.txt

chmod +x ./test.sh

2、准备数据库表和触发器

选择一个数据库执行如下命令:

CREATE TABLE test1(a1 INT) type=InnoDB;

CREATE TABLE test2(a2 INT) type=InnoDB;

CREATE TABLE test3(a3 INT NOT NULL AUTO_INCREMENT PRIMARY KEY) type=InnoDB;

CREATE TABLE test4(

a4 INT NOT NULL AUTO_INCREMENT PRIMARY KEY,

b4 INT DEFAULT 0

) type=InnoDB;

DELIMITER |

DROP TRIGGER /*!50032 IF EXISTS */ `test`.`testref`|

create trigger `test`.`testref` BEFORE INSERT on `test`.`test1` for each row BEGIN

DECLARE done INT DEFAULT 999;

INSERT INTO test2 SET a2 = NEW.a1;

DELETE FROM test3 WHERE a3 = NEW.a1;

UPDATE test4 SET b4 = b4 + 1 WHERE a4 = NEW.a1;

set done = sys_exec("/mysqlUDFtest/test.sh");

IF done != 0 then

INSERT INTO `<>22.t3` VALUES (a,b);

end if;

END;

|

DELIMITER ;

3、向test1表中插入一条数据

向test1表中插入一条数据后,检查linux系统中的/mysqlUDFtest目录下testlog

里的时间是否跟数据插入时间一致。

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

存储过程与触发器实验日期和时间: 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.管理员信息表。作用:记录负责管理书库和借书还书工作的管理员信息。至少包 括:管理员编号、职工编号(在职工档案表中的职工编号)、用户名、密码、管 理员级别等……。 6.职工档案表表。作用:记录职工档案。至少包括: 职工编号、姓名、性别、单 位、职称、职务、出生日期、学历、……其它字段自拟。

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

实验6 数据库实验——存储过程和触发器

实验6 存储过程与触发器 一、实验目的 1、加深与巩固对存储过程与触发器概念的理解。 2、掌握触发器的简单应用。 3、掌握存储过程的简单应用。 二、实验内容 一)存储过程: 1、创建一存储过程,求l+2+3+…+n,并打印结果。 CREATE PROCEDURE addresult AS DECLARE @n int=10,/*最后一个数*/ @i int=0, @result int=0 /*结果*/ BEGIN WHILE(@i<=@n) BEGIN SET @result=@result+@i SET @i=@i+1 END PRINT'1+2+3+、、、+n的结果就是:' PRINT @result RETURN(@result) END GO 2.调用上面的addresult存储过程,打印l十2+3+…+10的结果。EXEC addresult

3、修改上述存储过程为addresult1,使得@n为输入参数,其具体值由用户调用此存储过程时指定。 CREATE PROCEDURE addresult1 @n int=10 /*最后一个数*/ AS DECLARE @i int=0, @result int=0 /*结果*/ BEGIN WHILE(@i<=@n) BEGIN SET @result=@result+@i SET @i=@i+1 END PRINT'1+2+3+、、、+n的结果就是:' PRINT @result RETURN(@result) END GO 4、调用上面修改后的addresult1存储过程,打印l+2+3+…+100的结果。 EXEC addresult1 100 5.修改上述存储过程为addresult2,将@n参数设定默认值为10,并改设@sum为输出参数,让主程序能够接收计算结果。

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

存储过程与触发器 实验报告

信息工程学院实验报告 课程名称:《数据库原理》 实验项目名称:存储过程与触发器 一、实验目的: (1)了解存储过程的概念 (2)掌握创建、执行存储过程的方法 (3)了解查看、修改和删除存储过程的方法 (4)了解触发器的概念 (5)掌握创建触发器的方法 (6)掌握查看、修改、删除触发器信息的方法 二、实验设备与器件 Win7 +Sql server 2008 三、实验内容与步骤 (一)存储过程 运行实验四附录中的SQL语句,准备实验数据。然后创建下列存储过程,并调试运行存储过程,查看运行结果。 1.在企业管理器中创建一个名为StuInfo的存储过程,完成的功能是在student表中查询系号为D2的学号、姓名、性别、年龄、系号的内容。 CREATE PROCEDURE StuInfo AS SELECT SNO AS学号, SNAME AS姓名, SSEX AS性别, SAGE AS年龄, DNO AS系号 FROM student WHERE DNO='D2' 结果: stuinfo 2.使用T_SQL语句创建存储过程,完成的功能是在表student,course和study中查询以下字段:学号、姓名、性别、课程名称、考试分数。

use mydb --查询是否已存在此存储过程,如果存在,就删除它 if exists(select name from sysobjects where name='StuScoreInfo'and type='P') drop procedure StuScoreInfo go --创建存储过程 CREATE PROCEDURE StuScoreInfo as select student.sno as学号, sname as姓名, ssex as性别, https://www.360docs.net/doc/8412797359.html,ame as课程名称, study.grade as考试分数 from student,course,study where student.sno=study.sno and https://www.360docs.net/doc/8412797359.html,o=https://www.360docs.net/doc/8412797359.html,o 结果: StuScoreInfo 3.使用T_SQL语句创建一个带有参数的存储过程stu_sno_info,该存储过程根据传入的学生编号,在student表中查询此学生的信息。 if exists(select name from sysobjects where name='stu_info'and type='P') drop procedure stu_info go --创建存储过程 create procedure stu_info @sno varchar(8) as select sno as学号, sname as姓名, ssex as性别, sage as年龄, dno as年级

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

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

MySQL存储过程实例教程

MySQL存储过程实例教程 MySQL 5.0以后的版本开始支持存储过程,存储过程具有一致性、高效性、安全性和体系结构等特点,本节将通过具体的实例讲解PHP是如何操纵MySQL存储过程的。 实例261:存储过程的创建 这是一个创建存储过程的实例 录像位置:光盘mingrisoft9?lt;/p> 实例说明 为了保证数据的完整性、一致性,提高应用的性能,常采用存储过程技术。MySQL 5.0之前的版本并不支持存储过程,随着MySQL技术的日趋完善,存储过程将在以后的项目中得到广泛的应用。本实例将介绍在MySQL 5.0以后的版本中创建存储过程。 技术要点 一个存储过程包括名字、参数列表,以及可以包括很多SQL语句的SQL语句集。下面为一个存储过程的定义过程: create procedure proc_name (in parameter integer)begindeclare variable varchar(20);if parameter=1 thenset variable='MySQL';elseset variable='PHP';end if;insert into tb (name) values (variable);end; MySQL中存储过程的建立以关键字create procedure开始,后面紧跟存储过程的名称和参数。MySQL的存储过程名称不区分大小写,例如PROCE1()和proce1()代表同一个存储过程名。存储过程名不能与MySQL数据库中的内建函数重名。 存储过程的参数一般由3部分组成。第一部分可以是in、out或inout。in表示向存储过程中传入参数;out表示向外传出参数;inout表示定义的参数可传入存储过程,并可以被存储过程修改后传出存储过程,存储过程默认为传入参数,所以参数in可以省略。第二部分为参数名。第三部分为参数的类型,该类型为MySQL数据库中所有可用的字段类型,如果有多个参数,参数之间可以用逗号进行分割。 MySQL存储过程的语句块以begin开始,以end结束。语句体中可以包含变量的声明、控制语句、SQL查询语句等。由于存储过程内部语句要以分号结束,所以在定义存储过程前应将语句结束标志“;”更改为其他字符,并且该字符在存储过程中出现的几率也应该较低,可以用关键字delimiter更改。例如: mysql>delimiter // 存储过程创建之后,可用如下语句进行删除,参数proc_name指存储过程名。 drop procedure proc_name 实现过程

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

南昌航空大学实验报告 二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)

MySQL存储过程简单入门

MySQL存储过程语法 1、概念 存储过程就是能完成一定操作的一组SQL语句。 2、作用 大大提高效率(存储过程本身执行速度非常快,而且,调用存储过程大大减少数据库交互次数);提高重用性。 3、使用方法 1、创建: create procedure sp_name() begin …… end 注意:可能有参数。 2、调用: call sp_name() 注意:括号不能省略。 3、删除: drop procedure sp_name 注意:没有括号,不能在一个存储过程中删除另一个存储过程,只能调用。 4、语句: 条件语句, if 条件then statement else statement end if while循环语句, [label:] while expression do statement end while [label]; loop循环语句, [label:] loop statement end loop [label];

repeat until循环语句, [label] repeat statement until expression end repeat [label]; 5、常用命令: show procedure status:显示数据库所有存储过程基本信息。 show create procedure sp_name:显示一个存储过程详细信息。 关于运算符和基本函数与Java有些区别,用时注意就行。 4、实例 1、创建: create procedure proc_name (in parameter integer) begin declare variable varchar(20); if parameter=1 then set variable='MySQL'; else set variable='PHP'; end if; insert into tb (name) values (variable); end; 注意:代码不区分大小写;存储过程之间以及存储过程与内建函数不能同名; 存储过程参数(in传入,out传出,inout可传入,修改后传出,缺省是in); 由于存储过程内部要以分号结束,需要delimiter进行更改。 2、实现: ⑴、mysql –u用户名–p用户密码 ⑵、delimiter //(将结束符号“;”改成“//”,避免与存储过程冲突) ⑶、use 数据库名 ⑷、……(创建存储过程) ⑸、call proc_name(5)//(调用存储过程) -------------------------------------------- call proc_name(@para)//(对应存储过程定义中out的输出) select @para// ⑹、show procedure status//与show create procedure proc_name// 3、程序代码调用:(out型的部分代码) try{ //调取out型的存储过程P(计算记录总数) stmt = conn.prepareCall("{call p(?)}"); //读取所有OUT型的存储过程的返回参数数据 stmt.registerOutParameter(1, Types.INTEGER); stmt.execute(); int i= stmt.getInt(1);

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

南昌航空大学实验报告 二00 年月日 课程名称:数据库概论实验名称:数据库存储过程与触发器 班级:122031 姓名:同组人: 指导教师评定:签名: 一、实验环境 1.Windows2000或以上版本; 2.SQLServer 2005。 二、实验目的 熟悉不同数据库的存储过程和触发器,重点实践SQL Server2005,掌握SQL Server2005中有存储过程与触发器的相关知识。 三、实验要求 完成实验指导书中p115-7和p132 -4。 四、实验步骤及参考源代码 1.创建与执行存储过程 create procedure C_P_Proc as select distinct https://www.360docs.net/doc/8412797359.html,o,cna,pna,num from paper,customer,cp where https://www.360docs.net/doc/8412797359.html,o=https://www.360docs.net/doc/8412797359.html,o and paper.pno=cp.pno and cna='李涛' or cna='钱金浩' go execute C_P_Proc 2.删除存储过程 drop procedure C_P_Proc 3.创建插入触发器 create trigger TR_PAPER_I ON PAKER12203125 FOR INSERT AS DECLARE @appr float DECLARE @apno int SELECT @appr=ppr,@apno=pno from inserted begin if @appr<0 or @appr is null begin

raiserror('报纸的单价为空或小于!',16,1) update paper set ppr=10 where paper.pno=@apno end end 4.创建删除触发器 create Trigger TR_PAPER_D on PAKER12203125 after delete as declare @ipno char(6) declare @icount int; select @icount= count(*) from deleted,cp where deleted.pno=cp.pno if @icount>=1 begin select @ipno=pno from deleted raiserror('级联删除cp表中的数据',16,1) delete from cp where cp.pno=@ipno end 5.创建修改触发器 create trigger TR_PAPER_U ON PAKER12203125 for update as declare @ippr float select @ippr=ppr from inserted if @ippr<0 or @ippr is null begin raiserror('输入单价不正确',16,1) rollback transaction end 6. 分别对PAKER12203125表进行插入、修改、删除操作 insert into PAKER12203125 (pno,pna,ppr)values('000006','江西日报','1') insert into PAKER12203125 (pno,pna,ppr)values('000007','江南都市报','15.5') delete from PAKER12203125 where pno='000001' update PAKER12203125 set ppr=12.5 where pno='000002' update PAKER12203125 set ppr=-2 where pno='000004' 五、实验结果

MySQL存储过程练习

存储过程实验 一、实验要求: 1.理解存储过程的概念 2.掌握存储过程的语法格式、使用方法 3.掌握存储过程的创建、执行 二、实验内容: (注意:做一下实验需要首先建立数据及其相应的表,并输入一些记录) 1.实验1:创建一个存储过程,实现查询表student中的记录信息,并执行存储过 程 (1)创建存储过程: begin select * from student end (2)执行存储过程:运行 sp_liststudent (3)执行结果如下:

2.实验2.创建一个存储过程,根据给定的学生学号返回该学生的姓名(1)创建存储过程:

CREATE PROCEDURE test5( IN id int) BEGIN SELECT * from student s WHERE s.id=id; END (2)执行存储过程:CALL test5(2) 执行结果如下: 3.实验3. 创建一个存储过程,根据班级的编号,统计该班人数,并将人数以输出 变量返回给用户。 (1)创建存储过程: CREATE PROCEDURE test00( IN roomidint) BEGIN SELECT COUNT(*) from student s WHERE s.roomid=9; END (2)执行存储过程:CALL test00(2) (3)执行结果如下:

4.实验4:创建一个存储过程查询学号为“020101”的学生的平均分是否超过了85 分,若超过则输出“ X X考出了高分”,否则输出“XX 考的一般”。 (1)创建存储过程: CREATE PROCEDURE test05() BEGIN IF (SELECT score from student WHERE id=1)>85 THEN SELECT '考得好'; ELSE SELECT '考得不好'; END IF; END

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

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

相关文档
最新文档