[ カテゴリー » PC関連 ]

ADO.NET Parameterized SQLにDateTime.Maxを渡すとデータが来ない

備忘録。

ADO.NETで以下のようなParameterized SQLを設定、@EndにDateTime.Maxを設定すると検索件数が0になってしまう。
SELECT DISTINCT(name) FROM persons WHERE @Start<=releasedate AND releasedate<@End

@Endを'9999/12/31 23:59:59.9999999'Link としてMySQLのコマンドラインからこの文を打ち込むとデータが来る一方、'10000/1/1 0:00:00'とすると件数0。5桁の西暦で不具合起こすのはまぁあり得る話かなとは思いますが、DateTime.Maxもこの辺の際どい扱いを受けているのかも。

環境としてはサーバーはDebianのMySql 5.7.16、クライアントはMySql.Data 6.9.9、.NET Framework 4.5なのですが、この現象は私の開発マシン(Windows 8.1)や仮想マシン上のWindows 7では問題なかった実行ファイル一式が、別人のPC(Windows 8.1)だと不具合になったことで発覚。サーバーもクライアントも同じプログラム使っているのになぜ発生の有無があるのだろう。

@End=DateTime.Maxということは事実上releasedate上限無しということなので、WHERE句から外してやると正常に。面倒くさいけど@EndがDateTime.Maxの時はWHERE句に入れないようにクエリー文を切り替えたほうが無難そう。

— posted by mu at 10:14 am   commentComment [0]  pingTrackBack [0]

CIFS共有先MercurialレポジトリにAddするとAccess is denied

blog20170207-FreeNAS_ShowHiddenFiles

備忘録ではあるのですが、再現実験したらエラーが出なくなったのであくまで参考に。

FreeNAS (9.10.1-U2)に作成したMercurialレポジトリにWindows側からファイルをaddしようとすると、
abort: ¥¥server¥folder¥.hg¥.dirstate-lk0nhu: Access is denied
みたいなメッセージが出て失敗する場合、FreeNAS側の共有フォルダ詳細設定で隠しファイルを表示する設定にすると解決しました。

— posted by mu at 11:40 am   commentComment [0]  pingTrackBack [0]

フォルダ内のファイルが消えた!?

私しか使ってないFreeNASを9.10.2-U1にアップデートしたところ、あるフォルダ内のファイルが全部消え失せて目を疑う。

フォルダ構成は
pool1 (ZFSプール)
 +- Dataset1 (ZFSデータセット)
 |    +- Share1 (ディレクトリ/CIFS共有)
 |    |   +- Share1-1
 |    |   +- Share1-2
 |    |   ...
 |    |   +- Share1-n
 |    +- NoShare1 (ディレクトリ/Jail用)
 |        + NoShare1-1 (Share1-1をNullFSでマウント)
 ...
 +- DatasetN (ZFSデータセット)

これがアップデート後にShare1-1の中身が空っぽに。Share1-1にはサイズの大きいファイルがたくさんあったので本当に消えたのならpool1の空き容量が増えているはずだけど、その様子もなく。各種状態もエラーなし、scrubかけても正常。

ダメ元でfindコマンドでpool0内をファイル検索かけたところ…Share1-2の下にShare1-1フォルダが入っていたよ Σ(゚Д゚)

もちろんした覚えはないけど、間違いでWindowsからのファイル共有操作でフォルダを移動させてしまった可能性はある。ただ…元の場所に空のShare1-1フォルダは確かに存在したんだよなぁ。間違いでもご丁寧にフォルダ移動させたうえで、Share1-1作り直すなんてことはやらない。

今回FreeNASのアップデートは無罪でしょうけど、前回Link とか過去に何回かトラブル経験しているので、アップデートはヒヤヒヤものです。やっぱり不具合無い限り更新しない方が良いかなぁ…

— posted by mu at 03:54 pm   commentComment [0]  pingTrackBack [0]

MySQLでUPSERTとパーティショニングの両立方法が分からない

MySQLでUPSERTとパーティショニングを設定したいとします。運悪くパーティショニングをしたい列は一意にはなれないとします。

少し具体的にいうと、こんなテーブル。データが挿入された月毎でテーブルを分け、古いパーティションは後日捨てたい。timeがパーティショニングキーになります。一方システム要件として一意なデータを指定するにはidで十分なので、行の選択はidのみで指定されます。
create table test(id int, datetime time default current_timestamp);

MySQLでパーティショニングキーになる列には以下の要求事項があります。Partitioning Keys, Primary Keys, and Unique Keys (MySQL documentation)Link

  • そのテーブルに設定されている全てのUnique key/Primary keyに含まれていること
先にも言ったとおりtimeは一意性を保証できないので、idと組み合わせて一意性を確保することにします。
create table test(id int, datetime time, primary key(id, time)) 
partiotion by range columns(time)
 (partition p201612 values less than ('2016-12-01 00:00:00'),
  partition p201701 values less than ('2017-01-01 00:00:00'),
  partition p201702 values less than ('2017-02-01 00:00:00'),
  ...
 )

ここまでは問題なし。次にUPSERTとして有名なのは、INSERT ... ON DUPLICATE KEY UPDATE ...構文。が、Unique keyはidとtimeの二つで設定されているので、idだけ指定してtimeが適当ではINSERTしても重複と判定されずupdate文が実行されません。

重複判定させるためにid単独で別のUnique keyを作成しようとするとエラー。パーティションキーになる列は全てのUnique/primary keyに含まれるという制限に反するからです。

それならばとbefore updateのトリガーを指定して、更新しようとするidがテーブルになければidだけの行をinsertしておこうとする。

delimiter $$
create trigger test_updatetrigger
before update on test
for each row
begin
  if not exists (select 1 from test where id=new.id) then
    insert into test(id) values(new.id);
  end if;
end$$

これはトリガー発動時にエラー。トリガー関数内ではテーブルに対する操作は禁止されているLink とのこと。

というわけで現在ここで行き詰っており、王道であるアプリケーション側でのselect→insert/update対応になりそうです。こんな案件珍しくないと思うんだけど、なぜパーティションキーにUnique key設定が必要なんて使いにくい仕様があるんだろ。以前もちょっと複雑なSQL書こうとしたらハマった(で、MySQL捨てた)とか、どうも私はMySQLと馬が合わないようです。

— posted by mu at 07:03 pm   commentComment [0]  pingTrackBack [0]

またトラブった…

今週FreeNASLink のアップデートを適用したところ、今までJailからも見えていたdevfsがバッサリと見えなくなりました。FreeBSD関連の情報を見ると本来は/etc/devfs.rulesや/etc/rc.confを編集してJailにデバイスが見えるように設定するのが筋で、今まで見えていた方が何かおかしかったっぽいです。

とりあえず緊急回避的に、
/sbin/mount -t devfs devfs /your_jail_root/dev
をPostInitコマンドとして実行させることに。

以前も9.3→9.10にバージョンアップした時に、カーネルがFreeBSD 9から10に変わったことで別途入れていたカーネルモジュールがロードされなかったこともあったり。更新を無視したら毎日メール送ってくるし。FreeNAS、便利なんで使い続けたいのですが、ちょっと改造すると更新のたびにトラブルを警戒しないといけなくなるのが不満。FreeBSDに差し替えた方が良いのかなぁ…

[2016/10/3] タイトル変更

— posted by mu at 01:54 pm   commentComment [0]  pingTrackBack [0]

T: Y: ALL: Online:
ThemeSwitch
  • Basic
Created in 0.0245 sec.
prev
2026.2
next
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28