Search Postgresql Archives

Create Trigger Function For Table Partition.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



By referring to http://www.postgresql.org/docs/current/static/ddl-partitioning.html

(1) I create trigger function as follow :

CREATE OR REPLACE FUNCTION measurement_insert_trigger()
RETURNS TRIGGER AS 
$BODY$DECLARE
    measurement_table_index bigint;
    measurement_table_name text;
BEGIN
    measurement_table_index = NEW.measurement_id % 20;
    measurement_table_name = 'measurement_' || measurement_table_index;
    EXECUTE 'INSERT INTO ' || measurement_table_name || ' VALUES (NEW.*);';
    RETURN NULL;
END;$BODY$
LANGUAGE plpgsql;

CREATE TRIGGER insert_measurement_trigger
    BEFORE INSERT ON measurement
    FOR EACH ROW EXECUTE PROCEDURE measurement_insert_trigger();


I can see my trigger function named "measurement_insert_trigger" under pgadmin. However, I cannot see "insert_measurement_trigger"

http://sites.google.com/site/yanchengcheok/Home/cannot-see-trigger-point.PNG?attredirects=0

How can I see "insert_measurement_trigger" under pgadmin?

(2) When I execute SELECT * FROM create_lot();

CREATE OR REPLACE FUNCTION create_lot()
  RETURNS void AS
$BODY$DECLARE
    _lot_id bigint;
    _unit_id bigint;    
    count int;
    count2 int;   
BEGIN 
    INSERT INTO lot (v) VALUES ('Lot0') RETURNING lot_id INTO _lot_id;
    count = 1;    
    LOOP 
        INSERT INTO unit (fk_lot_id, v) VALUES (_lot_id, 'Unit') RETURNING unit_id INTO _unit_id;
       
        count2 = 1;
        LOOP
            INSERT INTO measurement (fk_unit_id, v) VALUES (_unit_id, 'Measurement');        
            count2 = count2 + 1;
            EXIT WHEN count2 > 3;
        END LOOP;
        
        count = count + 1;
        EXIT WHEN count > 3;
    END LOOP;  
END;$BODY$
  LANGUAGE 'plpgsql' VOLATILE
  COST 100;
ALTER FUNCTION create_lot() OWNER TO postgres;

I get the following error :

ERROR:  NEW used in query that is not in a rule
LINE 1: INSERT INTO measurement_9 VALUES (NEW.*);
                                          ^
QUERY:  INSERT INTO measurement_9 VALUES (NEW.*);
CONTEXT:  PL/pgSQL function "measurement_insert_trigger" line 7 at EXECUTE statement
SQL statement "INSERT INTO measurement (fk_unit_id, v) VALUES ( $1 , 'Measurement')"
PL/pgSQL function "create_lot" line 14 at SQL statement

It seems that NEW is not being recognized within EXECUTE statement. How can I avoid this problem? I cannot have "static SQL", as my table name needed to be dynamic generated.

Thanks and Regards
Yan Cheng CHEOK


      


-- 
Sent via pgsql-general mailing list (pgsql-general@xxxxxxxxxxxxxx)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Postgresql Jobs]     [Postgresql Admin]     [Postgresql Performance]     [Linux Clusters]     [PHP Home]     [PHP on Windows]     [Kernel Newbies]     [PHP Classes]     [PHP Books]     [PHP Databases]     [Postgresql & PHP]     [Yosemite]
  Powered by Linux