不具合?/テーブルデータ消え
以下の事象に遭遇しましたので報告いたします。

1) テーブルを2つ作成する。(仮にAとBとする)
2) テーブルBのカラムにテーブルAのカラムに対する参照整合ON UPDATE CASCADE/ON DELETE CASCADEの外部キー制約を持たせる。
3) テーブルA/Bにデータを格納する。
4) 「カラムの編集」フォームを利用してテーブルAにカラムを追加する。
→テーブルBのデータがすべて消える。

クエリウィンドウからテーブルAに対して alter table で add column するDDLを直接実行した場合はテーブルBのデータは消えません。

  • a13
  • 2017/02/23 (Thu) 00:34:00
Re: 不具合?/テーブルデータ消え
ご利用ありがとうございます。

実はカラムの追加の際に、並び替えなど大きな変更を考慮して、テーブルを再作成しておりました。
その為、On Deleteが働いているようです。
単純なカラム追加の場合はAlter Tableのみ実行し、テーブルの再作成が必要な場合は警告メッセージを表示するようにいたしました。

よろしくお願いします。
  • Pup
  • 2017/03/06 (Mon) 14:17:25
Re: 不具合?/テーブルデータ消え
どのように処理しているか知らずに言うので的が外れているかもしれませんし、
実際にためしてみたわけでもありませんが、
本件の対処として、最初に外部キー制約を無効化してからテーブル定義変更し、
変更後に元の外部キー制約有効状態に戻すといったような対応ではだめなんでしょうか?
(外部キー制約の無効化はトランザクションの途中で使っても意味ないようなので、テーブル変更とは別トランザクションで。)

また、細かくてどうでも良い点ですが以下がありました。

・初回起動時、次回以降は表示しないを選択した後、
 オプション変更をすると2度目の起動でもスタートページが表示される。

・メインウィンドウトップメニュー[ツール]内に不要な項目「ToolStripMenuItem41」が含まれる。
  • a13
  • 2017/03/11 (Sat) 12:50:38
Re: Re: 不具合?/テーブルデータ消え
もちろん。オプションからご自身で外部キーをオフにしから定義変更して頂けるなら、それに越した事はありませんよ。
私は単にAltert Table本来の動きを踏襲しょうとしているだけです。
  • Pup
  • 2017/03/11 (Sat) 14:14:50
Re: 不具合?/テーブルデータ消え
伝わっているのかいないのかよくわからないので、もうすこし詳しく記載します。
テーブルの再作成が必要な場合(テーブル定義変更時は統一的にでも良いかもしれませんが)、プログラムが以下のような処理をすることで対処できないでしょうか?
ということです。

1) PRAGMA foreign_keys; にて現在設定を取得する。
2) PRAGMA foreign_keys = OFF; にて外部キー制約を無効化する。
3) テーブル再作成
4) 手順1)で1が取得されていたならば PRAGMA foreign_keys = ON; する。
  • a13
  • 2017/03/11 (Sat) 15:30:23
Re: 不具合?/テーブルデータ消え
伝わっています。
プログラム内で勝手に外部キーの有効無効を変える事はしたくないだけです。
オプションがあるので利用者が変えるか、SQL文で全て行うかって事です。
  • Pup
  • 2017/03/11 (Sat) 22:06:53
Re: 不具合?/テーブルデータ消え
なるほど、やはりそういった思想の意味ですか。

私自身もソフトウェア開発に携わる者なので、その考えのもとの部分はわからなくはありません。
ただ、私の場合はそういった考えのもとで仕様を決めるのは中間層的な役割の部分をつくるときで、上位層(上位ソフトウェア層だったりユーザだったり)に対して、背後にある仕組みで利用出来る機能を覆い隠さないように、むやみな制限を課さないように、という場合です。
アプリケーション層で、ユーザに対して背後機能への単なる仲介役以上の機能を提供する(背後の仕組みを覆って/翻訳してユーザに見せる)部分で、内部事情によって行われる処理の面倒はアプリケーション自身が見るべきというように個人的には思いますけどね。(そういう役割をするのがアプリケーションだと思っています)

今回であれば、PupSQLiteのテーブルの定義編集機能を使う際には、内部都合によりテーブルの再作成が行われる場合があるので、ユーザがその内部動作を把握して適切に制約オプションを切り替えるべき、ということですよね。
一応警告はだすから、と。
作者さんがそうあるべきと思ってそういう仕様にしているならば、それで良いかと思います。
  • a13
  • 2017/03/12 (Sun) 21:00:53
Re: Re: 不具合?/テーブルデータ消え
ご理解頂けたのかわかりませんが、私はSQL全体としてわからないことが多くあるため苦労しています。
ただAlter Tableではカラムの並び替え、制約の変更がが出来ないという認識です。
なので、PupSQLite都合では無い認識です。
  • Pup
  • 2017/03/13 (Mon) 09:56:32
Re: 不具合?/テーブルデータ消え
再現性もないですが、検索していたらここに辿り着いたので一応書いておきます
ちょいちょいと行1列のデータが消えますねこれ
ID連番で入力作業をしているので不自然にIDが飛んでいることがあり
そこをベースにしているデータと照らし合わせると明らかに入力したものが消えていることがよくあります
カラム編集をしたりしながらやっているのでどのタイミングかはわかりませんが
結構クリティカルな問題に思えました

なぜこの値が出てくるのかとプログラム側で悩んだり調べたりと時間をかけ、
結果このソフトで入力した行のデータが消えていた
ということが何度かありました
  • 通りすがり
  • 2017/11/19 (Sun) 16:04:31
Re: Re: 不具合?/テーブルデータ消え
ご利用ありがとうございます。
このスレッドにも書いていますが、外部キーを使っている場合にカラム編集を行うとOn Deleteが聞いてしまうことかあります。
その際は警告を出していますが、警告なく消えるのであればほかの原因かも知れません。
外部キーを使っていない場合は、ちょっと想像がつきませんので再現出来ましたらご連絡頂ければありがたいです。
  • Pup
  • 2017/11/20 (Mon) 02:33:45

返信フォーム






プレビュー (投稿前に内容を確認)