たにーの楽しい闘争

日々の気になる事を書いていきます

【SQLServer】ミリ秒を意識する必要性

今日一瞬ひやっとしたのでメモ。

内容

例えば下記のような状況があったとする。
1. DateTimeOffset型のカラムを更新する。
2. 更新後、AzureのServiceBusに更新した時間をメッセージとして送信する。
(メッセージ送信をトリガーとして動く他システムがあり、そのシステムは受け取った更新時間を条件に1のデータをselectしてまた別のシステムに送るようなケース)

こんな状況で例えば1ではミリ秒は捨てて更新、2ではミリ秒を含んで送信、といった実装もし間違ってしてしまえば更新対象のデータが他システムに連携されず問題になってしまう。
上記のようなケースでは両方ともミリ秒で連携する必要がある。

string strDto2 = DateTimeOffset.UtcNow.ToString("o");//正解  

string strDto = DateTimeOffset.UtcNow.ToString();//不正解

実行結果

2020-09-12T15:13:44.3869652+00:00
2020/09/12 15:13:44 +00:00

因みに、SQLServerでは色々と決まり事が複雑なため特に意識して注意する事が必要そう。
DATETIME型はミリ秒の3桁目は丸め込まれてしまったり、
DATETIME型は時間範囲が「00:00:00 から 23:59:59.997」だけど、DateTimeOffsetは「00:00:00 から 23:59:59.9999999」だったり。

参考

www.earthlink.co.jp

【SQLServer】SELECT TOPやUPDATE TOPを使う時はorder byを必ず付けなければいけない理由

結論

ランダムで取得されてしまうため。
ランダムでも良いのであればorderbyを付けなくても良い。

UPDATE文の書き方に注意

orderbyを使わない書き方

UPDATE TOP (10) HumanResources.Employee
SET VacationHours = VacationHours * 1.25 ;

orderbyを使う場合

UPDATE HumanResources.Employee
SET VacationHours = VacationHours + 8
FROM (SELECT TOP 10 BusinessEntityID FROM HumanResources.Employee
     ORDER BY HireDate ASC) AS th
WHERE HumanResources.Employee.BusinessEntityID = th.BusinessEntityID;

参考

docs.microsoft.com

docs.microsoft.com

技術を選択する上で注意したい事

何となく選んで苦しんでしまうケース

例①
実装に1週間かけた後のパフォーマンステストで性能に問題がある事が発覚し、違うやり方で実装し直す
例②
新しい技術を選んだは良いが、詰まってしまい、メンバーに有識者もいないため、解決するために予想以上の時間がかかってしまう

結論

このようなケースは事前に整理すれば避ける事ができる。 最低でも下記のような点は押さえておきたい。

f:id:tanii0207:20200830183051p:plain

この時に注意しなければならないのが、要件期限
例えば18時に起動するバッチ処理で日次の連携件数が100万件以下でその日中に連携されれば良いのであれば、技術Bを選んだほうが安全だと言える。
一方で1hで1000万件処理しなければいけない、等の要件があればAを選ぶしかない。(もちろんBで実現できないかも考える必要がある)

【SQLServer】本番データのバックアップ手順

手順

  1. データの出力件数を確認してバックアップがどのくらいの容量になるのかを確認する
  2. 容量によって出力先を決める(本番環境が望ましいが、空き容量によっては検証または開発とする)
  3. SSMSから本番DBに接続する
  4. オブジェクトエクスプローラーからデータベースを右クリック
  5. [タスク]から[データのエクスポート]をクリック
  6. データソースをSQLServerNativeClient11.0に
  7. サーバー名をエクスポートしたいデータがあるサーバー名を指定する(この時サーバー名は手入力にする。▼のアイコンを押してしまうと固まってしまう)
  8. データベースを指定する(これも手入力が望ましい)
  9. データの出力先(変換先)も手順6.7.8と同じように設定する
  10. すべてのデータをバックアップする場合は、[1つ以上のテーブルまたはビューからデータをコピーする]を押下
  11. 出力したいチェックボックスにチェックを入れ、変換先のテーブル名を変更する。(DBにテーブルやビューが多く混在している場合は注意する)
  12. すぐに実行するを押下し、完了

AzureStorageEmulatorを使ってAppendBlob.CreateOrReplace()を実行するとエラーになる時の対処方法

状況

Azure Storage Emulatorのバージョン:5.7.0.0

やりたい事

AzureStorageEmulatorを使ってローカルのタスクテーブルから値を取得し、同じstorageAccountのBlobにAppendBlobを使って取得したレコードをcsvとして吐き出したい。

問題

下記が表示される

Message

{"リモート サーバーがエラーを返しました: (400) 要求が不適切です"}

ErrorCode

"FeatureNotSupportedByEmulator"

HttpStatusCode

"This feature is not currently supported by the Storage Emulator."

検証

今のバージョンではサポートされていない見たいなので、 下記からインストールしてバージョン 5.10に変更して解決

docs.microsoft.com

検証結果

まだ同じエラーが出る

結論

storageの向き先をAzureStorageEmulatorではなく、開発環境(既に発行されているStorageアカウント)にしたら正常に動いた。

AppendBlobはAzureStorageEmulatorではサポートされていないよう。

declined
How can we improve Azure Storage?
  • 187 votes
  • 9 comments

Provide support for append blobs in the Azure Storage Emulator

Currently Append Blobs aren't supported in the Azure Storage Emulator. Attempting an operation on an append blob returns a FeatureNotSupportedByEmulator error (HTTP status code 400 - Bad Request).

feedback.azure.com

教訓

  • 詰まったら文字に起こして頭の中を整理しよう
  • 最新のバージョンを使おう
  • ちゃんとエラーメッセージを細かく確認しよう
  • できれば公式ドキュメント読もう
  • 「サポートされていない」可能性も意識して調査しよう

大量データをAppendBlobで書き込む時に出るBlockCountExceedsLimit エラー (HTTP ステータス コード 409 – 競合)を解決する方法

問題

AppendBlobの仕様により、1ファイルに対して50000回しか書き込みができない。
例えば日次バッチで常時20万レコードをcsvに書き込みたい場合に1行ずつループして書き込むと、50001回目の書き込みで、下記のエラーが発生する

BlockCountExceedsLimit エラー (HTTP ステータス コード 409 – 競合) 

解決方法

上記の問題の場合、1行ずつ書き込むのではなく、100行に1回とかにすれば解決する。

参考

docs.microsoft.com

【Vue.js】基礎知識メモ

v-html

scriptタグ内で生成したhtmlタグを組み込みたい場合等

v-bind

タグの属性の値に変数等を設定したい場合等
書き方:<v-bind:属性名="設定する値">

v-if・v-else

条件によって表示を変えたい場合等

v-for

配列の値を順番に取り出し変数に入れてタグを出力したい場合等
書き方:<タグ v-for ="変数 in 配列">

v-model

inputタグで入力された値をVueのdataプロパティの値にバインドしたい場合等
書き方:<input v-model="変数名">

v-on

イベント関係の属性に値をバインドしたい場合
書き方:v-on:イベント名="処理"
例:<p v-on:click="insert"></p>(onclickをバインドしたい場合)
省略記法:<p @click="insert"></p>

参考

テンプレート構文 — Vue.js

templateタグ

複数のタグをひとまとめにするのに用いる
例えば複数行を条件によって、表示非表示にさせたい場合等
このタグ自体は表示されない。