2

ソース テーブルから履歴テーブルにデータを 1 時間ごとに自動的にバックアップする .NET ユーティリティを作成しています。アーカイブ テーブルが存在しない場合は、プログラムで作成する必要があります。通常は、の SQL でcreate db.historytable as db.sourcetable with no dataうまくいきます。ただし、create table asID 列を使用するテーブルでは機能しません。これは、新しい DDL を実行する前に、ソース テーブルの DDL を取得し、テーブルの名前を変更してから、ID 列を整数に変更する必要があることを意味します (履歴テーブルで ID 列を使用したくないため)。

テーブル内の各列の定義に対して列レベルの DDL を取得できれば、DataReader を使用してそれを反復処理し、DDL を再構築できます。COLUMNTYPE が 2 (2 は ID 列) の場合、その列の定義を次のように変更する必要があることがわかります。

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

..単に:

ID INTEGER

私が最後の手段として試してみることだけに興味がある他のオプションは、1) 複雑な正規表現を使用して ID 列の定義を通常の INTEGER に置き換えるか、2) dbc.columns と dbc.tables をクエリし、そこのメタデータを使用して構築することです。テーブル全体の DDL をゼロから作成します。

基本的に、概念的には dbc.columns に結合できる dbc.columnddl のようなものがあることを望んでいますが、それについては長い目で見ています。

4

2 に答える 2

1

AFAIK、Teradataデータディクショナリで探している形式の「列DDL」はありません。提案したように、DBC.Columnsから型などを再構築する必要があります。

また、これが役立つ場合もあります。システム内のID列を持つすべてのテーブルのリストを取得する方法は次のとおりです。

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

あなたはこの問題をよく考えました。あなたが言及した 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;
于 2012-12-06T01:26:36.740 に答える