`

mysql 通过函数执本地命令、外部程序

阅读更多

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

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

http://forge.mysql.com/projects/project.php?id=211

 

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

http://www.mysqludf.org/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表中插入一条数据后,检查linux系统中的/mysqlUDFtest目录下testlog
里的时间是否跟数据插入时间一致。

分享到:
评论

相关推荐

    mysql调用外部脚本库

    MySQL数据库系统虽然功能强大,但在某些特定场景下,如需要执行操作系统级别的任务或者调用外部程序时,其原生功能可能会显得不足。这时,我们可以通过引入外部脚本库来扩展MySQL的功能。标题“mysql调用外部脚本库...

    MySQL 5.1中文手冊

    7.2.11. MySQL如何简化外部联合 7.2.12. MySQL如何优化ORDER BY 7.2.13. MySQL如何优化GROUP BY 7.2.14. MySQL如何优化LIMIT 7.2.15. 如何避免表扫描 7.2.16. INSERT语句的速度 7.2.17. UPDATE语句的速度 7.2.18. ...

    mysql官方中文参考手册

    7.2.11. MySQL如何简化外部联合 7.2.12. MySQL如何优化ORDER BY 7.2.13. MySQL如何优化GROUP BY 7.2.14. MySQL如何优化LIMIT 7.2.15. 如何避免表扫描 7.2.16. INSERT语句的速度 7.2.17. UPDATE语句的速度 7.2.18. ...

    MySQL 5.1官方简体中文参考手册

    7.2.11. MySQL如何简化外部联合 7.2.12. MySQL如何优化ORDER BY 7.2.13. MySQL如何优化GROUP BY 7.2.14. MySQL如何优化LIMIT 7.2.15. 如何避免表扫描 7.2.16. INSERT语句的速度 7.2.17. UPDATE语句的速度 7.2.18. ...

    MySQL 5.1参考手册

    7.2.11. MySQL如何简化外部联合 7.2.12. MySQL如何优化ORDER BY 7.2.13. MySQL如何优化GROUP BY 7.2.14. MySQL如何优化LIMIT 7.2.15. 如何避免表扫描 7.2.16. INSERT语句的速度 7.2.17. UPDATE语句的速度 7.2.18. ...

    MySQL 5.1参考手册 (中文版)

    7.2.11. MySQL如何简化外部联合 7.2.12. MySQL如何优化ORDER BY 7.2.13. MySQL如何优化GROUP BY 7.2.14. MySQL如何优化LIMIT 7.2.15. 如何避免表扫描 7.2.16. INSERT语句的速度 7.2.17. UPDATE语句的速度 7.2.18. ...

    MySQL 5.1参考手册中文版

    7.2.11. MySQL如何简化外部联合 7.2.12. MySQL如何优化ORDER BY 7.2.13. MySQL如何优化GROUP BY 7.2.14. MySQL如何优化LIMIT 7.2.15. 如何避免表扫描 7.2.16. INSERT语句的速度 7.2.17. UPDATE语句的速度 ...

    MySQL5.1参考手册官方简体中文版

    7.2.11. MySQL如何简化外部联合 7.2.12. MySQL如何优化ORDER BY 7.2.13. MySQL如何优化GROUP BY 7.2.14. MySQL如何优化LIMIT 7.2.15. 如何避免表扫描 7.2.16. INSERT语句的速度 7.2.17. UPDATE语句的速度 7.2.18. ...

    MYSQL中文手册

    7.2.11. MySQL如何简化外部联合 7.2.12. MySQL如何优化ORDER BY 7.2.13. MySQL如何优化GROUP BY 7.2.14. MySQL如何优化LIMIT 7.2.15. 如何避免表扫描 7.2.16. INSERT语句的速度 7.2.17. UPDATE语句的速度 ...

    mysql5.1中文手册

    MySQL本地化和国际应用 5.10.1. 数据和排序用字符集 5.10.2. 设置错误消息语言 5.10.3. 添加新的字符集 5.10.4. 字符定义数组 5.10.5. 字符串比较支持 5.10.6. 多字节字符支持 5.10.7. 字符集...

    test_ini.rar_MYSQL

    5. 调用DLL函数:在主程序中,可以直接像调用本地函数一样调用DLL中的函数。 接下来,我们转向MYSQL数据库的使用。MYSQL是一个开源的关系型数据库管理系统,广泛应用于Web应用开发,具有高性能、高可靠性以及易于...

    命令注入讲解ppt.pptx

    1.外部参数可控应用程序调用了能够执行系统命令的函数,比如服务器程序通过 system 、 eval 、 exec 等危险函数直接或者间接调用了 cmd.exe 。而攻击者恰好能够控制这些函数的参数,比如可以通过浏览器或者一些其他...

    易语言本地硬盘上运行的程序

    本地硬盘上的程序,通常是指安装在计算机硬盘上的可执行文件(.exe),当用户双击或者通过命令行调用时,操作系统会加载并执行这些程序。 2. **GetDriveTypeA函数**:这是一个Windows API函数,用于获取指定驱动器...

    MySQL-DropBox_bs0iz6_MYSQL_

    `proc_open`是PHP中的一个函数,用于执行外部命令并接收其输出。如果这个文件没有使用`proc_open`,可能是因为在某些环境下该函数不可用或者被禁用,因此采用了其他方法来实现同步和压缩。 4. **7a06cbff6d52a62488...

    php mysql安全机制

    通过SQL命令`UPDATE mysql.user SET Password = PASSWORD('newpwd') WHERE User = 'root';`并执行`FLUSH PRIVILEGES;`来更新权限表,确保只有授权用户才能访问数据库系统。 #### 3. 访问控制列表(ACL)与SSL支持 ...

    纯as3链接本地数据库

    标题"纯AS3链接本地数据库"暗示我们将不依赖任何外部库,如asSQL-Beta2.8.swc或rps.swc,而是使用AS3的原生功能来实现这一目标。这通常意味着我们需要构建自定义的通信层,以便与MySQL数据库进行交互。 在AS3中,...

    易语言外部数据库使用

    外部数据库是指不在本地应用程序内部,而是通过网络或文件系统连接的数据库。这种数据库通常由专门的数据库管理系统(如MySQL、SQL Server、Oracle等)管理,提供了数据的存储、查询、更新和删除等功能。 二、...

    mydb数据库备份程序(PHP版)

    总的来说,《mydb数据库备份程序(PHP版)》为MySQL数据库的备份提供了一种自动化的方式,尽管存在潜在风险,但通过适当的学习和改进,它能成为维护数据安全的有力工具。在实际应用中,结合定期备份策略和验证恢复...

    GO 语言中 SQL 的 UT 实现.pdf

    在包目录中,以`_test.go`结尾的文件会被编译成测试程序,`go build`命令会忽略这些文件。测试文件中的以`Test`开头的函数会被`gotest`命令执行并输出结果。 #### 3. 常用的UT测试方法 ##### 3.1 函数变量测试法 ...

Global site tag (gtag.js) - Google Analytics