有没有办法使用DBC视图查询表的列级DDL?

时间:2012-11-29 17:50:25

标签: .net sql teradata

我正在编写一个.NET实用程序,它每小时自动将数据从源表备份到历史表。如果存档表不存在,则必须以编程方式创建。通常,create db.historytable as db.sourcetable with no data的SQL可以解决问题。但是,create table as不适用于使用标识列的表。这意味着您必须获取源表的DDL,更改表的名称,然后在运行新DDL之前将标识列更改为整数(因为我们不希望历史表使用标识列)。

如果我可以获得表中每列定义的列级DDL,那么我可以使用DataReader迭代它并重建DDL。如果COLUMNTYPE是2(2是标识列),那么我将知道修改该列的定义:

ID INTEGER GENERATED BY DEFAULT AS IDENTITY
   (START WITH 1 
    INCREMENT BY 1 
    MINVALUE 0 
    MAXVALUE 100000000 
    NO CYCLE)

..只是:

ID INTEGER

我唯一感兴趣的其他选项是作为最后的手段试用1)使用复杂的正则表达式将标识列定义替换为常规INTEGER或2)查询dbc.columns和dbc.tables并使用元数据从头开始构建整个表的DDL。

基本上,我希望我有一些概念上像dbc.columnddl这样的东西,我可以加入dbc.columns,但我知道,我正在做很长时间。

2 个答案:

答案 0 :(得分:1)

AFAIK,您在Teradata数据字典中寻找的格式中没有“列DDL”。你必须按照你的建议从DBC.Columns重建类型等。

此外,您可能会发现这很有用:以下是如何获取系统中包含标识列的所有表的列表:

locking row for access select  trim (d.databasename) || '.' || trim(v.TVMName)
FROM DBC.IdCol id, DBC.TVM v, dbc.dbase d
where 1=1
and id.tableid = v.TVMId
and v.TableKind='T'
and id.databaseid = d.databaseid
and d.databasename <> 'DBC'
;

答案 1 :(得分:0)

你认为这个问题很好,我同意你提到的两种方法可能是最简单的,即使它们是非平凡的。但是,如果您只是想为数据创建存档,我建议使用Teradata的存档实用程序ARCMAIN。这个问题由ARCMAIN轻松解决。以下是关于stackexchange Teradata: How to back up a table that uses an identity column?

的另一个答案的引用
  

备份的方法,以后可以使用相同的键恢复   是使用归档/恢复工具ARCMAIN。

     

像这样备份:

logon my_server/my_user, my_password; 
archive data tables (my_database.my_table), release lock, file=backup_file;
     

像这样恢复:

logon my_server/my_user, my_password;
restore data tables (my_database.my_table), release lock, file=backup_file;