昨天接到一个需求,要求凳明拦在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
|
创建Service Broker应用程序大体步骤如下:1、定义希望应用程序执行的异步任务。
2、确定Service Broker的发起方服务和目标服务是否创建在同一个SQL Server实例中。如果是两个实例,实例间的通信还需要创建经过证书认证或NT安全的身份认证,并且要创建端点、路由以及对话安全模式。
3、如果没有启用,则在多方参与的数据库中使用Alter Database命令设置Enable_broker以及Truseworthy数据库选项。
4、为所有多方参与的数据库创建数据库主密钥。
5、创建希望在服务之间发送的消息类型。
6、创建契约(Contract)来定义可以由发起方发送的各种消息以及由目标发送的消息类型的种类。
7、同时在两方参与的数据库中创建用于保存消息的队列。
8、同时在绑定特定约定到特定队列的多方参与的数据库中创建服务。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)