
昨天接到一个需求,要求在mysql的触发器中执行一个外部程序。
一开始没有什么头绪,后来发现嘿嘿。
id=211
有个叫mysqludf的一个东西,用起来还不错。
不过这个东西仅仅在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 `$amp<amp $gt22.t3`="" (a,b)end="" ifEND
|
DML触发器有三类:1, insert触发器;
2, update触发器;
3, delete触发器;
触发器的组成部分:
触发器的声明,指定触发器定时,事件,表名以类型
触发器的执行,PL/SQL块或对过程的调用
触发器的限制条件,通过where子句实现
类型:
应用程序触发器,前台开发工具提供的;
数据库触发器,定义在数据库内部由某种条件引发;分为:
DML触发器;
数据库级触发器;
替代触发器;
DML触发器组件:
1,触发器定时
2,触发器事件
3,表名
4, 触发器类型
5, When子句
6, 触发器主体
可创建触发器的对象:数据库表,数据库视图,用户模式,数据库实例
创建DML触发器:
Create [or replace] trigger [模式.]触发器名
Before| after insert|delete|(update of 列名)
On 表名
[for each row]
When 条件
PL/SQL块
For each row的意义是:在一次 *** 作表的语句中,每 *** 作成功一行就会触发一次;不写的话,表示是表级触发器,则无论 *** 作多少行,都只触发一次;
When条件的出现说明了,在DML *** 作的时候也许一定会触发触发器,但是触发器不一定会做实际的工作,比如when 后的条件不为真的时候,触发器只是简单地跳过了PL/SQL块;
Insert触发器的创建:
create or replace trigger tg_insert
before insert on student
begin
dbms_output.put_line('insert trigger is chufa le .....')
end
执行的效果:
SQL>insert into student
2 values(202,'dongqian','f')
insert trigger is chufa le .....
update表级触发器的例子:
create or replace trigger tg_updatestudent
after update on student
begin
dbms_output.put_line('update trigger is chufale .....')
end
运行效果:
SQL>update student set se='f'
update trigger is chufale .....
已更新8行;
可见,表级触发器在更新了多行的情况下,只触发了一次;
创建触发器 是特殊的存储过程,自动执行,一般不要有返回值。
1、后触发器 (AFTER,FOR)先执行对应语句,后执行触发器中的语句。
2、前触发器 并没有真正的执行触发语句(insert,update,delete),而是执行触发后的语句。
3、行级触发器 (FOR EACH ROW) 在SQL server 中不存在。
扩展资料:创建触发的语法
CREATE TRIGGER trigger_name --触发器名称
ON table_name --触发的表
[WITH ENCRYPTION]
FOR [DELETE, INSERT, UPDATE] --选择触发器类型
AS --触发后要做的语句
T-SQL语句
GO --结束标记
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)