【问题标题】:Is there a way to query a column-level DDL for a table using DBC views?有没有办法使用 DBC 视图查询表的列级 DDL?
【发布时间】:2012-12-11 05:36:42
【问题描述】:

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

如果我可以为表中每一列的定义获取列级 DDL,那么我可以使用 DataReader 遍历该 DDL 并重建 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 中,但我知道,我在这方面做得很远。

【问题讨论】:

  • 我使用存储过程复制了 CREATE TABLE 语句,该存储过程使用了几个 DBC 数据字典表。

标签: .net sql teradata


【解决方案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'
;

【讨论】:

    【解决方案2】:

    您已经很好地考虑了这个问题,我同意您提到的两种方法可能是最简单的,即使它们并不简单。但是,如果您只是想为您的数据创建存档,我建议您使用 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;
    

    【讨论】:

      猜你喜欢
      • 2022-01-08
      • 1970-01-01
      • 2018-08-26
      • 2012-10-06
      • 2019-07-12
      • 2013-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多