2014-09-11 9 views
0

У меня есть триггер в MySQL записана как например:MySQL Trigger для PostgreSQL Trigger

DELIMITER $$ 

CREATE TRIGGER mytrigger 
BEFORE INSERT ON people 
FOR EACH ROW 
BEGIN 

    SET NEW.first_name = SUBSTRING_INDEX(SUBSTRING_INDEX(NEW.name, ' ', 1), ' ', -1); 

    SET NEW.last_name = SUBSTRING_INDEX(SUBSTRING_INDEX(NEW.name, ' ', 3), ' ', -1); 

    SET NEW.middle_name = IF(LENGTH(NEW.name) - LENGTH(REPLACE(NEW.name, ' ', ''))>1 
     ,SUBSTRING_INDEX(SUBSTRING_INDEX(NEW.name, ' ', 2), ' ', -1) 
     ,NULL); 

END$$ 

DELIMITER ; 

Я переключение на PostgreSQL, так как вариант ClearDB Heroku для MySQL требует плана затрат беспорядочного количества денег, чтобы использовать триггера

Мой вопрос: я пробовал все, как я могу заставить этот триггер работать в PostgreSQL?

+0

«* Я пробовал все * "- что именно вы делали? –

+0

@a_horse_with_no_name Я попытался создать этот же триггер в Postgres, используя ту же самую информацию, указанную выше, из 'SET NEW.first_name ...' to 'SET NEW.middle_name ...' Postgres распознает это как действительный синтаксис просто как триггер, но когда я пытаюсь получить к нему доступ в моем приложении, я получаю много «неизвестной функции», затем переключился на 'SUBSTRING_INDEX' на' SPLIT_PART', а затем появился целый новый набор ошибок. –

+0

Оператор присваивания: '= = в PL/pgSQL, а не' SET': http://www.postgresql.org/docs/current/static/plpgsql-statements.html#PLPGSQL-STATEMENTS-ASSIGNMENT –

ответ

0

После обновления моей базы данных PostgreSQL с помощью https://github.com/pornel/mysqlcompat. Я был в состоянии успешно и правильно переформатировать мой триггер выглядеть так:

Функция триггера выглядит следующим образом:

CREATE OR REPLACE FUNCTION name_split() 
    RETURNS trigger AS 
$BODY$BEGIN 
NEW.first_name := SUBSTRING_INDEX(SUBSTRING_INDEX(NEW.name, ' ', 1), ' ', -1); 
NEW.last_name := IF(LENGTH(NEW.name) - LENGTH(REPLACE(NEW.name, ' ', ''))>1 
     ,SUBSTRING_INDEX(SUBSTRING_INDEX(NEW.name, ' ', 3), ' ', -3) 
     ,SUBSTRING_INDEX(SUBSTRING_INDEX(NEW.name, ' ', 3), ' ', -2)); 
NEW.middle_name := IF(LENGTH(NEW.name) - LENGTH(REPLACE(NEW.name, ' ', ''))>1 
     ,SUBSTRING_INDEX(SUBSTRING_INDEX(NEW.name, ' ', 2), ' ', -2) 
     ,NULL); 
RETURN NEW; 
END;$BODY$ 
    LANGUAGE plpgsql VOLATILE 
    COST 100; 

И фактический триггер гласит:

CREATE TRIGGER split 
    BEFORE INSERT OR UPDATE 
    ON actors 
    FOR EACH ROW 
    EXECUTE PROCEDURE name_split(); 
+0

Ключ был использован https://github.com/pornel/mysqlcompat, поэтому моя база данных PostgreSQL могла бы понимать «substring_index» и «if» среди других функций. Оттуда он просто сделал небольшую настройку, чтобы заставить ее работать правильно –