2

我正在编写一个 .NET 实用程序,它每小时自动将数据从源表备份到历史表。如果存档表不存在,则必须以编程方式创建它。通常,SQLcreate db.historytable as db.sourcetable with no data可以解决问题。但是,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,但我知道,我对此做了很长的尝试。

4

2 回答 2

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'
;
于 2012-12-10T21:36:42.913 回答
0

您已经很好地考虑了这个问题,我同意您提到的两种方法可能是最简单的,即使它们并不重要。但是,如果您只是想为您的数据创建存档,我建议您使用 Teradata 的存档实用程序 ARCMAIN。ARCMAIN 轻松解决了这个问题。这是stackexchange Teradata上另一个答案的引用:如何备份使用标识列的表?

制作备份以供以后使用相同的密钥恢复的方法是使用存档/恢复工具 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;
于 2012-12-06T01:26:36.740 回答