【问题标题】:How to get full length of DDL for a table or any object in redshift / postgresql如何在 redshift / postgresql 中获取表或任何对象的全长 DDL
【发布时间】:2014-06-01 02:02:08
【问题描述】:

团队, 我正在研究红移( 8.0.2 )。我想为 redshift 中的任何对象类型(表/视图...)设置 DDL 命令。

我有以下一个。但它没有给出全文。

select s.userid,u.usename,s.starttime, s.type, rtrim(s.text) from svl_statementtext s, pg_user u
 where u.usesysid = s.userid
 and s.type = 'DDL' 
 and s.text like '%table11%' 
 order by s.starttime asc;

 userid |                                                             usename                                                              |         starttime          | type |                                                                                                   text
--------+----------------------------------------------------------------------------------------------------------------------------------+----------------------------+------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    143 | user11                                                                                                                           | 2014-04-16 23:42:06.227296 | DDL  | CREATE TABLE table11 ( log_time date, user_name text, database_name text, process_id integer, connection_from text, session_id text, session_line_num bigint, command_tag text, session_start_time
    143 | user11                                                                                                                           | 2014-04-16 23:42:06.234987 | DDL  | CREATE TABLE table11 ( log_time date, user_name text, database_name text, process_id integer, connection_from text, session_id text, session_line_num bigint, command_tag text, session_start_time
(2 rows)

在 Oracle 中,我们有 DDL_METADATA.GET_DDL pkg。它将给出全文。我也想拥有同样的。我尝试使用 STL_DDLTEXT。文本被修剪了很多。

select xid, starttime, sequence, substring(text,1,40) as text
from stl_ddltext where  userid = 100 and text like '%table11%'  order by xid desc, sequence;
  xid   |         starttime          | sequence |                   text
--------+----------------------------+----------+------------------------------------------
 135475 | 2014-04-16 23:42:06.234987 |        0 | CREATE TABLE table11 ( log_time dat
 135475 | 2014-04-16 23:42:06.227296 |        0 | CREATE TABLE table11 ( log_time dat
(2 rows)

我对第一个查询输出还有一些疑问。 “用户名”的列长度太高。如何修剪。如果我查询 pg_user,它会在内部进行修剪。在 oracle 中,我们可以拥有例如

" col <col_name> for a80  " 

第二个疑问:我得到 2 行。实际上我只创建了一张桌子。输出中有 2 行的任何原因?

例如在物理 postgre db 中,如果我们想为一个函数生成任何 ddl, 我们可以在下面使用。

在下面,函数名是“add”

SELECT pg_catalog.pg_get_functiondef('add'::regproc);

像这样,我们在 Redshift 中有任何用于表/视图的 pkg 吗?

谢谢

【问题讨论】:

    标签: amazon-redshift


    【解决方案1】:

    我在 Redshift 中没有找到提供此功能的单个函数。您可以使用 pg_get_viewdef 函数获取视图的完整定义:

    SELECT 'create view '|| nc.nspname::information_schema.sql_identifier ||'.'|| c.relname::information_schema.sql_identifier ||' as '||
     pg_get_viewdef(c.oid)::information_schema.character_data AS view_definition
    FROM pg_namespace nc, pg_class c, pg_user u
    WHERE c.relnamespace = nc.oid AND u.usesysid = c.relowner AND c.relkind = 'v'::"char" 
    AND nc.nspname NOT IN ('pg_catalog', 'pg_toast', 'information_schema');
    

    对于表定义,我已经整理了一个查询,但仍需要一些工作来填写注释行中指出的一些细节:

    select tm.schemaname||'.'||tm.tablename, 'create table '||tm.schemaname||'.'||tm.tablename
    ||' ('
    ||cp.coldef
    -- primary key
    -- diststyle
    -- dist key
    ||d.distkey
    --sort key 
    || (select 
    ' sortkey(' ||substr(array_to_string(
                     array( select ','||cast(column_name as varchar(100))  as str from
                           (select column_name from information_schema.columns col where  col.table_schema= tm.schemaname and col.table_name=tm.tablename) c2
                            join 
                            (-- gives sort cols
                              select attrelid as tableid, attname as colname, attsortkeyord as sort_col_order from pg_attribute pa where 
                              pa.attnum > 0  AND NOT pa.attisdropped AND pa.attsortkeyord > 0
                            ) st on tm.tableid=st.tableid and c2.column_name=st.colname   order by sort_col_order
                          )
                    ,'')
                  ,2,10000) || ')'
    )
    ||';'
    from 
    -- t  master table list
    (
    SELECT substring(n.nspname,1,100) as schemaname, substring(c.relname,1,100) as tablename, c.oid as tableid 
    FROM pg_namespace n, pg_class c
    WHERE n.oid = c.relnamespace 
    AND nspname NOT IN ('pg_catalog', 'pg_toast', 'information_schema')
    AND c.relname <> 'temp_staging_tables_1'
    -- and c.relname in ('f_recipient_registration','ht_base_document','ht_folder','ht_logical_file','ht_transaction_addresses','ht_ysi_batch','ht_ysi_batch_messages','ht_ysi_files') 
    ) tm 
    -- cp  creates the col params for the create string
    join
    (select 
    substr(str,(charindex('QQQ',str)+3),(charindex('ZZZ',str))-(charindex('QQQ',str)+3)) as tableid
    ,substr(replace(replace(str,'ZZZ',''),'QQQ'||substr(str,(charindex('QQQ',str)+3),(charindex('ZZZ',str))-(charindex('QQQ',str)+3)),''),2,10000) as coldef
    from
    ( select array_to_string(array(
    SELECT  'QQQ'||cast(t.tableid as varchar(10))||'ZZZ'|| ','||column_name||' '|| decode(udt_name,'bpchar','char',udt_name) || decode(character_maximum_length,null,'', '('||cast(character_maximum_length as varchar(9))||')'   )
    -- default
    || decode(substr(column_default,2,8),'identity','',null,'',' default '||column_default||' ')
    -- nullable
    || decode(is_nullable,'YES',' NULL ','NO',' NOT NULL ') 
    -- identity 
    || decode(substr(column_default,2,8),'identity',' identity('||substr(column_default,(charindex('''',column_default)+1), (length(column_default)-charindex('''',reverse(column_default))-charindex('''',column_default)   ) )  ||') ', '') as str 
    from  
    -- ci  all the col info
    (
    select cast(t.tableid as int), cast(table_schema as varchar(100)), cast(table_name as varchar(100)), cast(column_name as varchar(100)), 
    cast(ordinal_position as int), cast(column_default as varchar(100)), cast(is_nullable as varchar(20)) , cast(udt_name as varchar(50))  ,cast(character_maximum_length as int),
    sort_col_order  , decode(d.colname,null,0,1) dist_key 
    from (select * from information_schema.columns c where  c.table_schema= t.schemaname and c.table_name=t.tablename) c
    left join 
    (-- gives sort cols
    select attrelid as tableid, attname as colname, attsortkeyord as sort_col_order from  pg_attribute a where 
     a.attnum > 0  AND NOT a.attisdropped AND a.attsortkeyord > 0
    ) s on t.tableid=s.tableid and c.column_name=s.colname
    left join 
    -- gives dist col
    (select attrelid as tableid, attname as colname from pg_attribute a where
      a.attnum > 0 AND NOT a.attisdropped  AND a.attisdistkey = 't'
    ) d on t.tableid=d.tableid and c.column_name=d.colname
    order by ordinal_position
    ) ci 
    -- for the working array funct
    ), '') as str
    from 
    (-- need tableid
    SELECT substring(n.nspname,1,100) as schemaname, substring(c.relname,1,100) as tablename, c.oid as tableid 
    FROM pg_namespace n, pg_class c
    WHERE n.oid = c.relnamespace 
    AND nspname NOT IN ('pg_catalog', 'pg_toast', 'information_schema')
    ) t 
    -- for the agg functions that dont exist
    -- ) group by table_schema, table_name 
    )) cp on tm.tableid=cp.tableid
    -- add in primary key query here
    -- dist key
    left join
    (  select 
    -- close off the col defs after the primary key 
    ')' ||
    ' distkey('|| cast(column_name as varchar(100)) ||')'  as distkey, t.tableid
    from information_schema.columns c
    join 
    (-- need tableid
      SELECT substring(n.nspname,1,100) as schemaname, substring(c.relname,1,100) as tablename, c.oid as tableid 
      FROM pg_namespace n, pg_class c
      WHERE n.oid = c.relnamespace 
      AND nspname NOT IN ('pg_catalog', 'pg_toast', 'information_schema')
    ) t on c.table_schema= t.schemaname and c.table_name=t.tablename
    join 
    -- gives dist col
    (select attrelid as tableid, attname as colname from pg_attribute a where
      a.attnum > 0 AND NOT a.attisdropped  AND a.attisdistkey = 't'
      ) d on t.tableid=d.tableid and c.column_name=d.colname    
    ) d on tm.tableid=d.tableid 
    

    【讨论】:

      【解决方案2】:

      对于 DDL:

      【讨论】:

      • 请注意,这可行,但不会列出表格压缩,这可能会派上用场
      • @Julik 在我的例子中,它正确显示了编码、diststyle、distkey 和 sortkey
      猜你喜欢
      • 2023-01-30
      • 2018-06-23
      • 1970-01-01
      • 1970-01-01
      • 2016-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-15
      相关资源
      最近更新 更多