PostgreSQLのautocommit offが使えない子
部署でまともにRDB使ってるのはたった3名だけ。
俺以外の2名はlinuxサーバーにログインしてKIAIでSQL文法叩く人でして、、、
俺はツール使いつつやる側の人間なんでPhpPgAdminとか使いつつやってます。
(XreaでもPhpPgAdminが使えるから)
昔から一部PhpPgAdmin機能的に問題があったんですが、
できない部分はもちろんlinuxにリモートで・・・なんてことはせず、
簡単なクエリ発行するphp用意して騙し騙し使ってました。
最近になってせがちゅうのおっさんがRDB使用してシステムを組もうとしてたので、
とりあえず荒地のような状態からの開発じゃ大変だろうし、
折角なんでアドミニストレーターツールをきっちりと整備しようとしてみた。
俺以外の2名はlinuxサーバーにログインしてKIAIでSQL文法叩く人でして、、、
俺はツール使いつつやる側の人間なんでPhpPgAdminとか使いつつやってます。
(XreaでもPhpPgAdminが使えるから)
昔から一部PhpPgAdmin機能的に問題があったんですが、
できない部分はもちろんlinuxにリモートで・・・なんてことはせず、
簡単なクエリ発行するphp用意して騙し騙し使ってました。
最近になってせがちゅうのおっさんがRDB使用してシステムを組もうとしてたので、
とりあえず荒地のような状態からの開発じゃ大変だろうし、
折角なんでアドミニストレーターツールをきっちりと整備しようとしてみた。
会社のPostgreSQL(7.0.3だったか7.1.3だったか?)はautocommitしないような仕組みになってるんだが。
アドミニストレーター等の管理ツールを使おうとすると
全然自動でcommitしてくれなくてあまりにも使い勝手が悪いことが判明。
この手のは大抵動的にやってくれないと困るんですが、全部やってくれてないっぽいです。
autocommit offな部署サーバーと各ツール挙動(というか相性?)の悪さを一部紹介。
pgadmin III →すべての操作においてcommitはクエリツール等でcommitなりendなり入れないと反映されない。
PhpPgAdmin→テーブル作成、レコード編集、カラム変更等は問題なし。
テーブルのドロップ及びカラムドロップが正常に終了しつつもcommitされずに華麗に戻る。
クエリベタ打ちもダメっぽかったきがす。
かねやんpgadmin→そもそもテーブルすらうまく拾えてなかった。ベータ版だから?とりあえず見なかった方向で。
黒猫SQL Studio(ODBC)→オプションの自動トランザクション開始と自動コミットのチェックを入れるとレコードを動的に変更ができた。
元々テーブル操作はできないんで、テーブルは省略。
他のツール・・・めぼしいのがぜんぜんないw
仕方ないってことで、急遽PhpPgAdminを改造して無理やりcommitさせるような動作にすることに。
手直ししたところはPhpPgAdminが入っているところにあるいくつかのphpで
tables.php、tblproperties.php、sql.phpと、とりあえず3箇所ほど。
以下PhpPgAdmin4.2.1、tblproperties.phpを基準で書いていきますが
多分どのverでもどのphpでも大差ないと思われ。
621行目(下から3行目くらい)にある$misc->printFooter();
の下に以下を記述。
$sql = "commit";
if (!($misc = pg_exec($sql))) {
die;
}
ロールバック記述が無いのでロールバックしないのが前提みたいな感じですが、
特別レコードいじるわけでもなく、バッチで大量処理するわけでもなく。
必要性がほとんどないだろうってことでロールバック考慮してません。
sql.phpについては必要に応じて最初からはずしておいてもいいような気も。
ただ、4.1.2使ってた時はコネクション取れてたかどうかよくわかんねーし、
意外とエラー吐いてくれたんで、PhpPgAdminのSQLベタはあんま使わなかったなあってのが本音。
ロールバックしたければ別なの使えばいいやみたいな感じでよければこれでなんとかなると思う。
他にもcommit効かない部分があれば、随時似たようなポイント(下から3行目くらいの$misc->printFooter()の下)を追加すればOKだとおもー
注意点らしい注意点があるとすれば、PhpPgAdminで変更しつつそのほかの黒猫SQL等でレコード見てたりすると排他がかかることがある。
元々カラムの変更等はPostgreSQLで排他かけてしまうようなので、
どちらか落とさないと動かなくなったりすることもある。まあ、これはしょうがないといえばしょうがないんですがw
おまけ
家にPostgreSQL(8.3)入れてautocommitをon(つうかデフォルト設定)でそもそもロールバックができるか試してみた。
テーブル適当に作って
begin;
insertx8くらい
でselectしたら当然ながら8件取得。
ここでrollbackするとちゃんと戻って0件になった。
begin;
insertx8やって
ここで別のセッション開始してselectを発行して0件を確認。
insertしたセッションでselectして8件を確認。
commitして別セッションで8件確認。。。
つまりなんつうかあれですかね。
きちんとbeginとかrollbackとかcommitとかセットしとけば
autocommit関係ないってことですね。
簡単にまとめるとサーバー設定ミ(アーーッ)
ま、いまさら変更したところで、BEGIN切り忘れている部分があったら予定外動作するの明白だし
ここの設定は今変えるように頼んでもどうにもならなさそ。

認証、名前入れが面倒だという方はこちらをどうぞ


コメントする
認証について細かいことはこちらをみてください