我有桌子' ABANDON'以下字段,
ID bigint(40)
CALLID varchar(100)
STATUS varchar(10)
每当为已放弃的调用插入CALLID时,我都会将其传递给shell脚本进行处理,
这是我的触发器,
DELIMITER @@
CREATE TRIGGER abandon_insert AFTER INSERT ON ABANDON
FOR EACH ROW
BEGIN
DECLARE cmd CHAR(255);
DECLARE result int(10);
DECLARE ckey varchar(100);
SET ckey := NEW.CALLID;
SET cmd="/usr/bin/tellabandon ckey";
SET result = sys_exec(cmd);
END;
@@
DELIMITER ;
我无法将列值分配给变量。
在我的SET命令字符串中,我将引用的值作为" ckey"而不是分配给变量的列的实际值。
可能出现什么问题?
谢谢,
答案 0 :(得分:0)
在你的set语句中,“ckey”是文字字符串的一部分。
= "/usr/bin/tellabandon ckey";
^^^^
要获取ckey
变量的值,可以连接文字字符串和变量值
= CONCAT("/usr/bin/tellabandon ",ckey);
重要注意事项:考虑一下ckey
包含某些恶意内容时可能会获得的行为,通过某些内容向CALLID
列分配一些内容,例如。
'foo && rm -f /tmp/*'
或
'`rm -f /tmp/*`'
(我不确定什么可以传递到sys_exec
,它做了什么样的检查,但对我来说似乎很危险。)
另外,请注意,使用NULL值进行字符串连接会导致NULL。
您可能需要考虑一些检查,了解您将允许哪些值,逃避潜在危险的角色等。