2012-02-21 2 views
4

У меня есть триггер PostgreSQL 9, как это:Бегство переменной PL/PgSQL

CREATE OR REPLACE FUNCTION clients_update_billingdata_trigger() 
RETURNS trigger AS 
$BODY$ 
DECLARE 
    columnsUpdate TEXT; 
BEGIN 
    columnsUpdate := ''; 

    IF (NEW.rsocial IS DISTINCT FROM OLD.rsocial) THEN 
     columnsUpdate := columnsUpdate || 'RSocial before: ' || OLD.rsocial || '. RSocial after: ' || NEW.rsocial || E'\n'; 
    END IF; 

    IF (NEW.legalidentifier IS DISTINCT FROM OLD.legalidentifier) THEN 
     columnsUpdate := columnsUpdate || 'ILegal before: ' || OLD.legalidentifier || '. ILegal after: ' || NEW.legalidentifier || E'\n'; 
    END IF; 

    [...] 

    IF (columnsUpdate != '') THEN 
     SELECT dblink_exec ('dbname=xxx user=xxx password=xxxxx', 
          'INSERT INTO BillingDataUpdate (client_id, columnsupdate) 
          VALUES (''' || NEW.idclient || ''', ''' || columnsUpdate || ''');'); 
    END IF; 
    RETURN NEW; 
END; 
$BODY$ 
LANGUAGE plpgsql; 

Значение NEW.rsocial может быть, например: услуги Томми. Если я выключу триггер, запись будет сохранена правильно (в таблице other, в Клиентах), потому что я избегаю строки в PHP с помощью функции pg_escape_string. Вопрос в том, как запустить NEW.rsocial для запуска триггера?

Заранее спасибо.

ответ

4

Функции quote_literal и quote_nullable могут быть полезны. Но будьте осторожны, что это функции PostgreSQL, поэтому убедитесь, что другая сторона DBLINK понимает результат.

Вы также можете взглянуть на эту часть документации:

http://www.postgresql.org/docs/9.1/interactive/plpgsql-statements.html#PLPGSQL-QUOTE-LITERAL-EXAMPLE

EDIT

quote_xyz не должны применяться к обычаям rsocial но к dblink_exec.

SELECT dblink_exec ('dbname=xxx user=xxx password=xxxxx', 
         'INSERT INTO BillingDataUpdate (client_id, columnsupdate) ' 
         || 'VALUES (' || quote_nullable(NEW.idclient) || ', ' 
         || quote_nullable(columnsUpdate) || ');'); 

И обратите внимание на изменившееся количество ' в конкатенации.

+0

Thanks @ A.H. но я проверял эти функции перед тем, как спросить, но «не работает» – doctore

+0

@doctore: Можете ли вы уточнить: что _exactly_ вы пытались и что было ошибкой? Код и примеры помогут больше всего. –

+1

@doctore: "* do not work *" не является допустимым сообщением об ошибке Postgres. –