greenplum은 함수를 통해 지정한 사용자 아래의 모든 테이블 문장을 가져옵니다.

함수 구현
-- 
CREATE OR REPLACE FUNCTION get_dbsize(dbname varchar)
RETURNS  VARCHAR AS
$FUNCTION$
DECLARE
	isExists 			varchar;
	dbsize 				varchar;
	databasename 		varchar;
BEGIN
	select datname into databasename from pg_database where lower(datname) = dbname;
	if databasename != '' THEN
		select pg_size_pretty(pg_database_size(lower(dbname))) into dbsize;
		return dbsize;
	else
		raise notice 'The database: % does not exists ! ',lower(dbname);
	end if;
END;
$FUNCTION$
LANGUAGE PLPGSQL;


--  get_table_structure  
CREATE PROCEDURAL LANGUAGE plpythonu;
create or replace function get_table_structure(tablename text)
    returns text
as $$
    try:
        table_name = tablename.lower().split('.')[1]
        talbe_schema=tablename.lower().split('.')[0]
    except (IndexError):
        return 'Please in put "tableschema.table_name"'
    get_table_oid="select oid,reloptions,relkind from pg_class where oid='%s'::regclass"%(tablename)
    try:
        rv_oid=plpy.execute(get_table_oid,5)
        if not rv_oid:
            return 'Did not find any relation named"'+tablename +'".'
    except (NameError):
        return 'Did not find any relation named"'+tablename +'".'
    table_oid=rv_oid[0]['oid']
    rv_reloptions=rv_oid[0]['reloptions']
    rv_relkind=rv_oid[0]['relkind']
    create_sql="";
    table_kind='table';
    if rv_relkind !='r' and rv_relkind !='v':
        plpy.error('%s is not table or view'%(tablename));
    elif rv_relkind=='v':
        get_view_def="select pg_get_viewdef(%s,'t') as viewdef;" % (table_oid)
        rv_viewdef=plpy.execute(get_view_def);
        create_sql='create view %s as 
' % (tablename) create_sql += rv_viewdef[0]['viewdef']+'
'; table_kind='view' else: get_columns="select a.attname,pg_catalog.format_type(a.atttypid,a.atttypmod),\ (select substring(pg_catalog.pg_get_expr(d.adbin,d.adrelid) for 128) \ from pg_catalog.pg_attrdef d where d.adrelid=a.attrelid and d.adnum=a.attnum and a.atthasdef) \ as default,a.attnotnull as isnull from pg_catalog.pg_attribute \ a where a.attrelid= %s and a.attnum >0 and not a.attisdropped order by a.attnum;" % (table_oid); rv_columns=plpy.execute(get_columns) get_table_distribution1="select attrnums from pg_catalog.gp_distribution_policy t where localoid = '" + table_oid + "' " rv_distribution1=plpy.execute(get_table_distribution1,500) rv_distribution2='' if rv_distribution1 and rv_distribution1[0]['attrnums']: get_table_distribution2="select attname from pg_attribute where attrelid='"+table_oid+"' and attnum in (" + str(rv_distribution1[0]['attrnums']).strip('{').strip('}').strip('[').strip(']')+")" rv_distribution2=plpy.execute(get_table_distribution2,500) create_sql='create table %s (
' % (tablename) get_index="select pg_get_indexdef(indexrelid) as indexdef from pg_index where indrelid=%s" % (table_oid); rv_index=plpy.execute(get_index); get_parinfo1="select attname as columnname from pg_attribute where attnum =(select paratts[0] from pg_partition where parrelid=%s) and attrelid=%s;"%(table_oid,table_oid); get_parinfo2=""" select pp.parrelid,prl.parchildrelid,case when pp.parkind='h'::"char" then 'hash'::text when pp.parkind='r'::"char" then 'range'::text when pp.parkind='l'::"char" then 'list'::text else null::text end as partitiontype,pg_get_partition_rule_def(prl.oid,true) as partitionboundary from pg_partition pp,pg_partition_rule prl where pp.paristemplate=false and pp.parrelid = %s and prl.paroid = pp.oid order by prl.parname; """ % (table_oid) v_par_parent=plpy.execute(get_parinfo1); v_par_info=plpy.execute(get_parinfo2); max_column_len=10 max_type_len=4 max_modifiers_len=4 max_default_len=4 for i in rv_columns: if i['attname']: if max_column_len < i['attname'].__len__(): max_column_len=i['attname'].__len__() if i['format_type']: if max_type_len < i['format_type'].__len__(): max_type_len=i['format_type'].__len__() if i['default']: if max_type_len < i['default'].__len__(): max_default_len=i['default'].__len__() first=True for i in rv_columns: if first==True: split_char=' '; first=False else: split_char=','; if i['attname']: create_sql += " " + split_char + i['attname'].ljust(max_column_len+6)+'' else: create_sql += "" + split_char + ' '.ljust(max_column_len+6) if i['format_type']: create_sql += ' ' + i['format_type'].ljust(max_type_len +2) else: create_sql += ' ' + ' '.ljust(max_type_len+2) if i['isnull'] and i['isnull']: create_sql += ' ' + ' not null '.ljust(8) if i['default']: create_sql += ' default ' + i['default'].ljust(max_default_len+6) create_sql += "
" create_sql += ")" if rv_reloptions: create_sql +=" with ("+str(rv_reloptions).strip('{').strip('}').strip('[').strip(']') +")
" create_sql = create_sql.replace("'",'') if rv_distribution2: create_sql += 'Distributed by (' for i in rv_distribution2: create_sql += i['attname'] + ',' create_sql =create_sql.strip(',')+')' elif rv_distribution1: create_sql += 'Distributed randomly
' if v_par_parent: partitiontype=v_par_info[0]['partitiontype']; create_sql +='
PARTITION BY '+ partitiontype + "("+v_par_parent[0]['columnname']+")
(
"; for i in v_par_info: create_sql +=" " +i['partitionboundary']+',
'; create_sql=create_sql.strip(',
'); create_sql+="
)" create_sql+=";

" for i in rv_index: create_sql += i['indexdef']+';
' get_table_comment="select 'comment on %s %s is '''|| COALESCE (description,'')|| '''' as comment from pg_description where objoid=%s and objsubid=0;" % (table_kind,tablename,table_oid) get_column_comment="select 'comment on column %s.'||b.attname ||' is ''' || COALESCE(a.description,'')|| ''' ' as comment from pg_catalog.pg_description a,pg_catalog.pg_attribute b where objoid=%s and a.objoid=b.attrelid and a.objsubid=b.attnum;" % (tablename,table_oid) rv_table_comment=plpy.execute(get_table_comment); rv_column_comment=plpy.execute(get_column_comment); for i in rv_table_comment: create_sql += i['comment']+';
' for i in rv_column_comment: create_sql +=i['comment']+';
' return create_sql; $$ LANGUAGE plpythonu; -- create table tab_structure(context text) distributed by context; CREATE OR REPLACE FUNCTION get_cts(username varchar) RETURNS void AS $FUNCTION$ DECLARE s_tab varchar; schema_name varchar; tabname varchar; vsql text; table_name cursor for select tablename from pg_tables where lower(tableowner) = username; BEGIN truncate table tab_structure; select schemaname into schema_name from pg_tables where lower(tableowner) = username; open table_name; loop fetch table_name into tabname; if not found then exit; end if; s_tab = schema_name ||'.' || tabname; vsql = 'insert into tab_structure select get_table_structure('''||s_tab||''')'; execute vsql; raise notice '% ',s_tab ; end loop; END; $FUNCTION$ LANGUAGE PLPGSQL;

테스트:
전체 사용자 이름 대상 아래의 테이블 문장 함수 가져오기 실행
testdb=# select get_cts('test'); -- test 
NOTICE:  public.t
NOTICE:  public.t1
NOTICE:  public.tab_structure
 get_cts 
---------
 
(1 row)

작성된 테이블 문구가 저장된 테이블 tab_ 보기structure;
testdb=# select * from tab_structure ;
                context                 
----------------------------------------
 create table public.t (                
   id               integer             
 )Distributed by (id);                  
                                        
 
 create table public.t1 (               
   id               integer             
  ,name             character varying   
 )Distributed by (id);                  
                                        
 
 create table public.tab_structure (    
   context          text                
 )Distributed by (context); 

왜냐하면 get_table_structure (schema.tablename) 이 함수는 한 번에 한 장의 표 구조만 얻을 수 있습니다.따라서 pg_를 사용하지 않으면dump, 모든 테이블의 원본 테이블 문장을 얻기 위해 get_cts (username) 이 함수
파일에 원본 테이블 구문을 저장하고 다음 명령을 수행합니다.
[gpadmin@mpp01 ~]$ psql -U test -d testdb -At -c "select get_cts('test')"
NOTICE:  public.t
NOTICE:  public.t1
NOTICE:  public.tab_structure

[gpadmin@mpp01 ~]$ psql -U test -d testdb -At -c "select * from tab_structure" >cts.sql

파일 보기cts.sql
[gpadmin@mpp01 ~]$ cat cts.sql 
create table public.t (
  id               integer  
)Distributed by (id);


create table public.t1 (
  id               integer            
 ,name             character varying  
)Distributed by (id);


create table public.tab_structure (
  context          text  
)Distributed by (context);

편리하니 참고하세요.

좋은 웹페이지 즐겨찾기