3

私が現在割り当てられているプログラムには、実際の処理の前に、テーブルの内容をバックアップテーブルにコピーするという要件があります。

コードレビュー中に、同僚は次のように指摘しました

INSERT INTO BACKUP_TABLE
SELECT *
FROM PRIMARY_TABLE

テーブルの列や列の順序が異なる可能性があるため、リスクが非常に高くなります。

また、テーブルを作成/削除/名前変更しないという制約もあります。〜ため息〜

表の列は変更されることが予想されるため、列名を単純にハードコーディングすることは、私が探している解決策ではありません。

私はこの仕事を成し遂げるための合理的で危険でない方法についてのアイデアを探しています。

4

5 に答える 5

7

バックアップテーブルは残りますか?データを永続的に保持しますか、それとも現在の値の単なるコピーですか?

作成/削除/名前の変更/コピーができないのは残念です。それ以外の場合、短期間の場合、何かがうまくいかない場合に使用するだけで、処理の開始時にそれをドロップして、次のようなことを行うことができます

create table backup_table as select * from primary_table;

最善のオプションは、選択を明示的にすることです。

insert into backup_table (<list of columns>) select <list of columns> from primary_table;

データディクショナリからSQL文字列を作成し、すぐに実行することで、これを生成できます。ただし、backup_tableにprimary_tableの重要な列がすべて含まれていない場合は、リスクが残ります。

明示的にしたいだけで、backup_tableが存在しない場合、またはprimary_tableの列のいずれかがbackup_tableにない場合は、メジャーエラーが発生する可能性があります。

于 2008-11-20T16:08:55.667 に答える
2

テーブルの構造をどのくらいの頻度で変更しますか? 構造が変わらなければ、メソッドは問題なく機能するはずです。個人的には、データベース管理者は、ストアド プロシージャなど、バックアップ テーブルを削除して再作成するためのメカニズムを提供する必要があると思います。切り捨てはDELETE FROM TABLE;.

于 2008-11-20T16:11:27.177 に答える
1

テーブルの列をリストするだけでは不十分な理由はありますか?それで

INSERT INTO backup_table( col1, col2, col3, ... colN )
  SELECT col1, col2, col3, ..., colN
    FROM primary_table

もちろん、これには、テーブルの1つの定義を変更するときにコードを再検討して、コードを変更する必要があるかどうかを判断する必要がありますが、通常、列の順序の違い、列の違いから身を守るための小さな代償です。名前、およびテーブル定義の無関係な違い。

于 2008-11-20T16:07:16.047 に答える
1

このような状況が発生した場合、問題の最初に2つのテーブルの列定義を取得します。次に、それらが同一である場合、私は単純なものに進みます。

INSERT INTO BACKUP_TABLE
SELECT *
FROM PRIMARY_TABLE

それらが異なる場合は、バックアップテーブルに重要な列が欠落していない場合にのみ続行します。この場合、バックアップコピーに次のフォームを使用します。

INSERT INTO BACKUP_TABLE (<list of columns>) 
SELECT <list of columns> 
FROM PRIMARY_TABLE

しかし、単にエラーでプログラムを停止した場合にどうなるかについても心配するので、両方のテーブルにある列に2番目の形式を使用し、テキストファイルをダンプするバックアップ計画もあるかもしれません。 PKとバックアップから欠落している列を使用します。プログラムが正常に完了したように見えても、エラーをログに記録します。そうすれば、最悪の事態が発生した場合にデータを回復できます。

本当に、これはどこかで対処すべき悪いプロセスの症状ですが、防御的なプログラミングは、あなたの問題ではなく、他の誰かの問題にするのに役立ちます。列が欠落しているテキストダンプについて通知するログエラーメッセージに気付かない場合は、それはあなたのせいではありません。

しかし、防御的にコーディングしないと、最悪の事態が発生した場合、それは部分的にあなたのせいになります。

于 2009-10-16T13:47:47.727 に答える
0

次のようなことを試すことができます:

CREATE TABLE secondary_table AS SELECT * FROM primary_table;

それが自動的にデータをコピーするかどうかはわかりません。そうでない場合:

CREATE TABLE secondary_table AS SELECT * FROM primary_table LIMIT 1;
INSERT INTO secondary_table SELECT * FROM primary_table;

編集:

申し訳ありませんが、あなたの投稿を完全には読んでいませんでした:特に制約の部分。方法がわからないのではないかと思います。私の推測では、長い挿入/選択クエリを作成する前に、最初に両方のテーブルを記述して比較する手順を使用します。

それでも、バックアップテーブルを使用している場合は、元のテーブルと完全に一致することが非常に重要だと思います。

于 2008-11-20T16:04:37.533 に答える