按月分區觸發器函數編寫,自動創建分區表

CREATE OR REPLACE FUNCTION trigger_function_test_yum()
  RETURNS trigger AS
$BODY$
DECLARE
str_time varchar;
str_sub_tablename varchar;
str_sql_cmd varchar;
BEGIN
     IF TG_OP <> 'INSERT' OR TG_TABLE_NAME <>'test_yum' OR TG_WHEN <> 'BEFORE' THEN  
        RETURN NULL;  
     END IF;
     --Generate Table Name  
     str_time = date_part('year',NEW.A)::varchar || '_' || CASE WHEN date_part('month',NEW.A) <10 THEN '0' ELSE '' END  ||date_part('month',NEW.A)::varchar;  
     str_sub_tablename = 'test_yum_' || str_time;
     --Check if table not created  
     select * from pg_tables where schemaname = 'public' and tablename=str_sub_tablename into str_sql_cmd;  
     IF NOT FOUND THEN  
        --Create table Cmd  
        str_sql_cmd = 'CREATE TABLE '||str_sub_tablename||
     ' (CONSTRAINT chk_'|| str_sub_tablename||
     ' CHECK(date_part(''year''::text, A) = '|| date_part('year',NEW.A)::varchar||
     ' AND date_part(''month''::text, A) = '|| date_part('month',NEW.A)::varchar||
     ' )) INHERITS (test_yum)  TABLESPACE ts_yum_global;';  
        EXECUTE str_sql_cmd;  
     END IF;  
     --insert Data  
     str_sql_cmd = 'INSERT INTO '||str_sub_tablename||'  VALUES($1,$2);';  
     EXECUTE str_sql_cmd USING
     NEW.A,
     NEW.B;  
     --return null because main table does not really contain data  
     RETURN NULL;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION trigger_function_test_yum()
  OWNER TO postgres;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章