データベースへの更新処理で Rollback/Commit の確認処理を自動化

SI事業では保守作業などでSQLを流してDB操作をすることがちょくちょくあります。(自社開発系は経験がないのでどうしてるか分かりません...)

今まで、ロールバックするように記述したスクリプトを発行し、正しく登録されることを確認してからコミットに書き直して登録という作業をしていました。

ですが、SQL Server には TRY-CATCH という構文が 2005 の時代からあるということを知ったのでメモしておこうと思います。

以下のように記載しておけば、コミットに書き直すなんて作業しなくなります。

begin try

    begin transaction

    -- 何かしらの更新処理

    commit transaction

end try
begin catch

    -- 以下の select 文でキャッチしたエラーの詳細を確認する
    select
        ERROR_NUMBER() AS ErrorNumber,
        ERROR_SEVERITY() AS ErrorSeverity,
        ERROR_STATE() AS ErrorState,
        ERROR_PROCEDURE() AS ErrorProcedure,
        ERROR_LINE() AS ErrorLine,
        ERROR_MESSAGE() AS ErrorMessage
    
    rollback transaction

    -- sqlcmd などのツールにエラーを伝播させるための throw
    -- SQL Server Management Studio で発行する場合は不要
    throw

end catch

他リポジトリのファイルをコミットも一緒に移行する方法

git を使っているとファイルを履歴ごと別のリポジトリに移行したい場合が発生すると思います。

例えば過去の構成管理ルールがあいまいでカオスになってしまったので一から作り直したいとか。

そんなリポジトリを移行したくなった時の手順をメモしておきます。

## 移行元リポジトリ格納フォルダ作成
$ mkdir .\<移行元リポジトリ格納フォルダ>
$ touch .\<移行元リポジトリ格納フォルダ>\.gitkeep
$ git add -A
$ git commit -m "取込用フォルダ作成"

## 移行元リポジトリをリモートリポジトリとして追加
$ git remote add <移行元リポジトリ名> <移行元リポジトリURL>
$ git fetch <移行元リポジトリ名>

## 移行元リポジトリを取り込み
$ git merge --allow-unrelated-histories -X \
subtree=<移行元リポジトリ格納フォルダ> <移行元リポジトリ名>/master

## 移行元のリモート登録を削除
$ git remote rm <移行元リポジトリ名>

Docker コンテナ内で実行した Angular アプリをホストからアクセスする

以下のコマンドで実行するとホストからアクセス出来るようになります。

$ ng serve --host=0.0.0.0 --poll

--host=0.0.0.0 を付けないと外部から見えなくなるそうです。

--poll をつけることで webpack がソースコードを監視する精度が上がってちゃんとホットリロードが聞くようになります。

PowerShell Core で確認ダイアログ

以下のコードで実装。

$title = "タイトル"
$message = "メッセージ"
$options = [System.Management.Automation.Host.ChoiceDescription[]](
   (New-Object System.Management.Automation.Host.ChoiceDescription "&Yes", "実行する"),
   (New-Object System.Management.Automation.Host.ChoiceDescription "&No", "実行しない")
)
$defaultChoice = 1
$result = $Host.UI.PromptForChoice($title, $message, $options, $defaultChoice)
if ($result -ne 0) { exit }

ちなみに、Command Prompt の pause コマンドは以下で再現出来ます。

Write-Host "続行するには何かキーを押してください...`n"
$host.UI.RawUI.ReadKey() | Out-Null

Windows で sudo を実現する、「gsudo」の紹介

Linux に慣れている人は Windowssudo コマンドがないことに不満はないでしょうか?

私はあります。

例えば、 Windows のパッケージマネージャーの 1 つである Chocolatey でアプリをインストールするときに管理者権限じゃないとインストール出来なくて一々開きなおすとか...。

そんな不満を Twitter にぶちまけていたら神ツールを紹介してくれる人が現れました。

というわけで、Windowssudo コマンドを実現する gsudo というツールを紹介します。

github.com

導入

gsudo は scoop もしくは chocolatey からインストール可能です。

scoop*

PS> scoop install gsudo

chocolatey

PS> choco install gsudo
PS> refreshenv # パス反映のためのリフレッシュコマンド

また、パッケージマネージャーを利用していなくても、下記コマンドでマニュアルインストール出来ます。

PS> PowerShell -Command "Set-ExecutionPolicy RemoteSigned -scope Process; iwr -useb https://raw.githubusercontent.com/gerardog/gsudo/master/installgsudo.ps1 | iex"

使い方

使い方はとてもシンプルで sudo コマンドとほぼ同じです。

以下のコマンドで新規ウィンドウを開くことなく、管理者権限に切り替えられます。

PS> gsudo

f:id:neko3cs:20200723154443p:plain

ただし、gsudoUAC のダイアログが表示されます。

これが、gsudo の由来かもしれません。(GUI sudo?)

f:id:neko3cs:20200723154527j:plain

また、管理者権限から抜けたい場合は以下のコマンドで抜けます。

PS> exit

f:id:neko3cs:20200723154728p:plain

当然ですが特定のコマンドに対してのみ gsudo を利用することも出来ます。

PS> gsudo choco install git # コマンド実行後に UAC が表示される

詳細な使い方は公式ドキュメントが丁寧なので分かりやすいです。

gerardog / gsudo - usage