2015-05-16 2 views
1

У меня есть таблица «ОТКАЗАТЬСЯ» со следующими полями,MySql Trigger переменная Issue не ссылается на командную строку

ID bigint(40) 
CALLID varchar(100)   
STATUS varchar(10) 

Всякий раз, когда CALLID вставляется в заброшенном вызов, я передать его в сценарий оболочки для обработки,

Вот мой триггер,

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

в наборе заявлении, "CKEY" является частью символьной строки.

= "/usr/bin/tellabandon ckey"; 
         ^^^^ 

Чтобы получить значение переменной ckey, вы можете сцепить символьной строки и значение переменной

= CONCAT("/usr/bin/tellabandon ",ckey); 

ВАЖНО: Рассмотрим поведение, которое вы могли бы потенциально получить если ckey содержит что-то нелепое, путем некоторого присвоения чего-то гнусного столбцу CALLID, например

'foo && rm -f /tmp/*' 

или

'`rm -f /tmp/*`' 

(я не уверен, что это можно передать в sys_exec, какие виды проверок это делает, но это, кажется, очень опасно для меня.)

Также , имейте в виду, что конкатенация строк со значением NULL приводит к NULL.

Возможно, вы захотите рассмотреть некоторые проверки того, какие значения вы хотите разрешить, избегая потенциально опасных символов и т. Д.

Смежные вопросы