2014-12-14 1 views
0

Я использую версию postgres: PostgreSQL 9.2.4 на x86_64-unknown-linux-gnu, скомпилированный gcc (Debian 4.7.2-5) 4.7.2, 64-битногоне может вставлять строку в таблицу при переадресации данных из родительской таблицы в дочернюю таблицу в триггере (хранимая процедура)

Описание:

у меня есть один родительская таблица и что родительская таблица имеет множество дочерних таблиц. Я хочу, чтобы перенаправить данные из родительской таблицы для дочерней таблицы (в то время как вставки)

(такой же, как по этой ссылке: Example Link) (например, мороженого компании)

я следующие вещи ...

create table tsttbl1 (id integer, name text); 

create table tsttbl1_hour0 (LIKE tsttbl1) INHERITS (tsttbl1); 

CREATE OR REPLACE FUNCTION insert_tsttbl1_hourbase() RETURNS TRIGGER AS $$ 
BEGIN 
    RAISE NOTICE 'Hi...%', NEW; 
    execute 'INSERT INTO ' || TG_TABLE_SCHEMA|| '.tsttbl1_hour0 values '|| NEW; 
    -- INSERT INTO tsttbl1_hour0 values (NEW.*)'; 
    RETURN NULL; 
END; 
$$ LANGUAGE plpgsql; 

create trigger trigger_insert_tsttbl1_hourbase before insert on tsttbl1 FOR EACH ROW EXECUTE PROCEDURE insert_tsttbl1_hourbase(); 

Здесь

родительская таблица: - tsttbl1

ребенок стол: - tsttable1_hour0

Пытается достичь: insert into tsttbl1 (id, name) values (0,'xyz'); следует вставить данные в tsttable1_hour0 вместо tsttbl1;

Но когда я попытался вставить строку, я получаю как это ...

ccc=# insert into tsttbl1 (id,name) values (1, 'abc'); 
LOG: statement: insert into tsttbl1 (id,name) values (1, 'abc'); 
NOTICE: Hi...(1,abc) 
ERROR: column "abc" does not exist 
LINE 1: INSERT INTO act1.tsttbl1_hour0 values (1,abc) 
               ^
QUERY: INSERT INTO act1.tsttbl1_hour0 values (1,abc) 
CONTEXT: PL/pgSQL function insert_tsttbl1_hourbase() line 4 at EXECUTE statement 

Дополнительная информация:

-> Это перенаправление данных также может быть достигнуто за счет правила. Но для моего случая эта вставка часто, поэтому правило может быть дорогостоящим сравнением с триггером ...

, так что я хочу достичь этого триггером.

-> если я ип комментарий линия "INSERT INTO значений tsttbl1_hour0 '(NEW *.)" .. строка вставляется успешно

-> если я ип комментарий линия "ВСТАВИТЬ INTO tsttbl1_hour0 значений (NEW.id, NEW.name) '».. строка вставляется успешно

ответ

0

Моя проблема решается таким образом ...

CREATE OR REPLACE FUNCTION insert_tsttbl1_hourbase() RETURNS TRIGGER AS $$ 
BEGIN 
    RAISE NOTICE 'Hi...%', NEW; 
    Execute 'set search_path to ' || TG_TABLE_SCHEMA|| ''; 
    INSERT INTO tsttbl1_hour0 values (NEW.*); 
    RETURN NULL; 
END; 
$$ LANGUAGE plpgsql; 

вместо SchemaName.tablename, я установил путь поиска перед заявлением.

1

команда execute является применение динамического SQL. Он выполнит следующую строку, но синтаксис, вставленный вместе, неверен. Оно должно быть:

execute 'INSERT INTO ' || TG_TABLE_SCHEMA|| '.tsttbl1_hour0 values (' || NEW.id || ', ''' || NEW.name || ''')'; 

Это было бы получить, что линия работает, но вместо того, вставив линию вместе со значениями, связывание будет лучше. См. Команду PREPARE.

Но зачем использовать динамический sql вообще, а не прокомментированную строку, которая успешно работает?

+0

спасибо ronin ... но проблема в моей таблице имеет 50 столбцов ... поэтому я не могу пойти с «New.id», «New.name» ... это возможно с New. * ??? –

+0

Я решил проблему .... :) спасибо за ответ –