2017-03-09 20 views
1

PHPスクリプトを使用してPostgresからSybaseに約10のテーブルを移行したいと考えています。PHPスクリプトを使用したPostgresからSybaseへの移行

これまでのところ、デスティネーションデータベースのすべての目的のテーブルを空にするだけの削除スクリプトが完成しました。

現在のmigrate-scriptは、両方のデータベースに接続してコンテンツをプリントアウトすることができます。それ以外にも、後のINSERT(私は最近、成功したSQLを正しくチェックし、それを調整するパラメータ@@ ERRORを学びました)に続いて、宛先テーブルがソーステーブルと一致するかどうかをチェックする行を数えます。


今私の問題は、私はエラーメッセージを得ることです:

警告:sybase_query():Sybaseの:サーバメッセージ: 付近に正しくない構文を '1'。 .../.../...

選択した行をPostgresデータベースからSybaseデータベースに挿入しようとすると、重大度15(手順N/A)になります。 したがって、fetch_assocメソッドを使用して、各行のデータを読み取りました。 http://php.net/manual/de/function.pg-fetch-assoc.php

このlookslike私のコード内の特定のポイント:

   while ($row = pg_fetch_assoc($result)) { 
       $insert_dst = $destDB->query("SET IDENTITY_INSERT " . $dst_sy_tbl . " ON INSERT INTO " . $dst_sy_tbl . " (Integerfield, SOME_TEXT1, SOME_TEXT2) VALUES(". $row['integerfield'] . " '" . $row['some_text1'] . "', '" . $row['sometext2'] . "')" ); 
       } 

ソース表の整数をINT4としてフォーマットされ、ここに見られるように、この方法の問題点は、それが、代わりに整数の文字列を返します。宛先テーブルの整数は数値(8,0)です。前述のメソッドは、数値(8,0)でフォーマットされた整数を必要とする列 "integerfield"に文字列を挿入しようとします。

Postgresからデータを受け取るより良い方法があるので、最初に文字列にフォーマットされずに後で整数に変換する必要はありません。


注:Insert into ... values (SELECT ... FROM ...)

しかし、私のdatabasetoolでこれを実行するには、それはそれのでSRC_TABLEにアクセスする権限を欠いていた:私もここにボードに見られるように、プレーンSQLで望んだ結果を取得しようとしました別のデータベースにあります。 - 両方の接続がすでに確立されているので、両方のテーブルの内容を印刷することができたので、phpスクリプト内でこれが動作する可能性があります。

SET IDENTITY_INSERT DST_Table ON INSERT INTO db_name.of.DST_Table(Integer, SOME_TEXT1, SOME_TEXT2) SELECT integer, some_text1, some_text2 FROM db_name.of.SRC_Table; 
+0

エラーメッセージと誤解し、結果セットのすべての行が文字列として指定されていると悪いと思っていました。最後に、私はSQLインサートコマンドを入れています。これは、文字列で構成されています。私の間違いは、私は1の代わりに整数を '1'として渡したということでした。別の間違いは誤った比較方法でした。私は盲目をSybaseのGO方向からPostgresスクリプトに、RETURN方向はPostgresをSybaseにコピーしました。 "string"を "varchar"に、 "datetime"を "timestamp" –

答えて

0

インポート/エクスポートツールを使用することができたら...

は、SybaseにデータをインポートするためBCPツールを使用して見なければなりません。

このsimilar SO Postは、使用する構文についての助けとなります。たとえば、export from Postgres into CSV formatの場合は、BCPのデータをSybase ASE

関連する問題