2

実際、私は 2 つのデータベースを持っています。1 つはステージング用で、もう 1 つは本番用です。たとえば、 という 1 つのテーブルと、 という別のテーブルへClass(class_id,descr,faculty_id)の参照。faculty_idFaculty(faculty_id, name,comment)

私の話は、ステージング データベース、Faculty テーブルで非常に多くの更新を行い、Class テーブルを変更せずに多くの教員のコメントと名前を変更したということです。ステージングの教員テーブルを本番にコピーしたいと考えています。私の元の方法は、ステージングからスクリプトを生成し、本番環境のデータ テーブルである学部を削除し、ステージング データ テーブルの学部を本番環境にコピーするためにスクリプトを実行することです。ただし、外部キーのために学部テーブルを削除できないことがわかりました。しかし、何百もの更新ステートメントを書き留めたくないし、本番環境で Class データを削除することもできません。Faculty テーブルを本番環境にコピーしたい場合はどうすればよいですか?

4

4 に答える 4

1

classandfacultyと doの関係を一時的に削除してから、再度関係を確立します。

于 2012-10-19T20:42:36.243 に答える
0

ステージングファカルティのすべての代理キーは、本番環境のキーと同じであると想定します。

  1. FacultyテーブルをFaculty_StagingとしてProductionにコピーします
  2. クラステーブルを変更し、外部キー参照を教員にドロップします
  3. Facultyの名前をFaculty_backupに変更します
  4. Faculty_Stagingの名前をFacultyに変更します
  5. クラステーブルを変更し、外部キー制約を復元します

外部キー参照を再構築する試みが失敗した場合は、ステージング教員テーブルの代理キーに問題があります。

  1. Facultyの名前をFaculty_Stagingに変更します
  2. Faculty_Backupの名前をFacultyに変更します
  3. クラステーブルを変更し、外部キー制約を復元します。

考慮事項:

  1. FacultyとFaculty_Stagingの代理キーは正確に一致していますか?
  2. FacultyとFaculty_Stagingの代替キーは正確に一致していますか?
  3. ファカルティステージングの生産行を誤って削除しましたか?
于 2012-10-19T23:12:05.673 に答える
0

これを試して:

外部キーを保持しているクラス テーブルをバックアップします。

クラス テーブルを切り捨てます。

教員を更新してください。

最後に、クラス テーブルを復元します。

于 2012-10-19T20:13:15.797 に答える
0

SQL を使用して SQL スクリプトを生成できることをご存知ですか? (これは、教員がステージングと本番で同じ教員 ID を持っている場合にのみ機能します)

これにより、新しい学部を挿入するスクリプトが生成されます。

SELECT 'INSERT INTO production.Faculty (faculty_id, name, comment) 
        SELECT TOP 1 '+LTRIM(faculty_id)+','''+name+''','''+comment+'''
          FROM production.Faculty
         WHERE NOT EXISTS (SELECT 1 FROM production.Faculty WHERE faculty_id = '+LTRIM(faculty_id)+');' AS runMeOnProduction
  FROM staging.Faculty

これにより、既存の学部を更新するためのスクリプトが生成されます。

SELECT 'UPDATE production.Faculty SET name = '''+name+''', comment = '''+comment+'''
         WHERE faculty_id = '+LTRIM(faculty_id)+';' AS runMeOnProduction
  FROM staging.Faculty

名前またはコメント フィールドに引用符が含まれている場合は、上記の SQL ステートメントの名前とコメントを次のように置き換えます。

REPLACE(name,'''','''''')
REPLACE(comment,'''','''''')

特に、両方の環境で両方のテーブルで挿入と更新を行う場合、これは最善の方法ではありません。しかし、教員のデータがステージングでのみ増加している場合、これは機能します。

また、一部のクエリ ソフトウェアでは、これらの SQL ステートメントを実行すると、文字列が長すぎて表示できないと判断され、blob または一部の 16 進数が表示されます。それ以外の場合は、別の SQL クエリ ツールを試してください。私はこの種のものにDBVisualiserを使用していますが、うまくいきます。私は特定の DB クエリ ツールを宣伝しているわけではありません。mySQL と MSSQL を頻繁にクエリする必要があるため、仕事を完了するためにアプリからアプリへとジャンプしていることに気づきました。

両方の環境にデータ エントリがある場合は、適切なデータ比較ツールの使用を検討する必要があり ます。

これはおそらく奇抜な考え方ですが、以前は便利だと思っていました...

于 2012-10-20T05:19:30.063 に答える