mysql触发器原生支持调用外部程序么

mysql触发器原生支持调用外部程序么,第1张

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

昨天接到一个需求,要求在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

|

使用非SQL格式dll,也就是平时所写的,如果打死也不明白就用他就可以。

dll需要事先先注册,

注册是:regsvr32 名字.dll

卸载是:regsvr32 /u 名字.dll

[vb] view plain copy

CREATE TRIGGER [名称] ON [表名]

AFTER INSERT, UPDATE, DELETE

AS

DECLARE @hr int

DECLARE @obj int

DECLARE @out varchar(200)

exec @hr = sp_oacreate '[名称空间|工程名].[类名]', @obj out

IF @hr = 0

BEGIN

exec @hr = sp_oamethod @obj,'[函数名]',@out output,'[参数1]','[参数2]',...'[参数N]'

if @hr = 0

BEGIN

print @out

END

END

使用SQL格式的DLL

以下这代码要放到master数据库执行

[c-sharp] view plain copy

CREATE PORC [名字] AS

BEGIN

DECLARE @out varchar(200)

EXEC exec sp_addextendedproc '[函数名]', '[名称空间|工程名

.dll' --添加dll进来

EXEC @out = [函数名] [参数1] [参数2] ... [参数N] --注意:函数名前不能用@函数名和参数之间,参数和参数之间,不能用,,我用过,报错了...

EXEC exec sp_sp_dropextendedproc'[函数名]' --这里就是卸载了

直接执行外部程序,例如exe,黑客爱好这代码

上面的代码黑客也爱好,为什么?我才不会告诉你他喜欢用sp_addextendproc来加载xp_cmdshell

[c-sharp] view plain copy

--以下代码不是顺序执行,只是说明

EXEC sp_configure 'show advanced options', 1RECONFIGUREEXEC sp_configure 'xp_cmdshell', 1RECONFIGURE-- 开启xp_cmdshell,几乎不需要执行,多数人不会主要到

EXEC sp_configure 'show advanced options', 1RECONFIGUREEXEC sp_configure 'xp_cmdshell', 0RECONFIGURE-- 这自然是关闭喽,要做啥非法事的话,就不要执行这句。

EXEC sp_addextendedproc xp_cmdshell,@dllname ='xplog70.dll'declare @o int --这句是如果不能执行xp_cmdshell时候,例如报127错误时修复使用

sp_addextendedproc 'xp_cmdshell','xpsql70.dll' -- 同上

--以下是使用xp_comshell

--有返回值

DECLARE @out int

EXEC @out = xp_cmdshell '[文件名]' '[参数1]' '[参数2]' ... '[参数N]'

无返回值

EXEC xp_comshenll'[文件名]' '[参数1]' '[参数2]' ... '[参数N]',no_output

1、在delphi中,将bde控件板的query控件放在form中,在其SQL属性中输入你的查询语句,在将active属性设为true就可执行SQL命令。

当然,之前你要安装mysql的odbc驱动,建立mysql的bde别名,要设置好数据库(database)、数据源(datasource)、查询(query)相互之间的联系。

2、Delphi一般使用TADOStoredProc来访问存储过程,TADOStoredProc与TADOQuery都是继承自TCustomADODataSet类,实际上使用TADOQuery来访问存储过程会更灵活一点:

存储过程脚本:

DELIMITER $$

DROP PROCEDURE IF EXISTS p_test1

CREATE PROCEDURE p_test1(

iSqn: INT,

sName: VARCHAR(40))

BEGIN

insert into t1(sqn, name) value(iSqn, sName)

END$$

DELIMITER

执行存储过程代码:

function Exec_Proc1: Boolean

begin

result := true

query.close

query.sql.clear

query.sql.add('call p_test1(:sqn, :name)')

query.Parameters[0].value := 1

query.Parameters[1].value := 'test'

try

query.ExecSql

except

result := false

//写日志什么的处理

end

end


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12205669.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存