スキップしてメイン コンテンツに移動

投稿

ラベル(postgresql)が付いた投稿を表示しています

INSERTしてからUPDATEする

UPSERT/MERGEの話ではない。 INSERT文とUPDATE文の両方をメンテナンスするのが面倒になってきた。 REPLACE文はDELETE走るし、MERGEは結局INSERT/UPDATEの両方にすべての項目を書かないといけないし、INSERTとUPDATEの両方で入力値が正しく登録されているかを確認しないといけない。 項目多いとめんどい。 そこで考えた。 こうすれば楽できないかと。 ■ぼくのかんがえたさいきょうのこうしんしょり トランザクション開始 IF 新規 THEN     主キーとデフォルト値でINSERT END IF 入力値でUPDATE コミット ・・・さて、仕事するかな

Corosync と Pacemaker でクラスタ化されたサーバのメンテナス

普通に監視対象サービスを停止しちゃうとフェイルオーバーするので、 それを回避する方法。 1.メンテナンスモードを有効にする。 crm configure property maintenance-mode=true 2.必要な作業を行う。 サービス停止してもフェイルオーバーしないので、設定ファイルいじったりできる。 停止したサービスは、起動してから次の手順へ。 停止は crm resource stop リソース名 開始は crm resource start リソース名 再起動は crm resource restart リソース名 ※その他、crmコマンドの詳細は、こちらのサイトがわかりやすかったです。 CRM CLI (command line interface) tool 3.メンテナンスモードを終了する。 crm configure property maintenance-mode=false 以上!

PDOのプリペアドステートメントで同じ名前のパラメータマーカは使えない

PDOでプリペアドステートメントを使うとき、クエリ中にパラメータマーカを指定するが、このとき、同じ名前のパラメータマーカは使えない。 でも、使ってもエラーにならない。 クエリの結果を精査すれば、クエリで想定した結果にならないためわかるのだが、テストが嫌いな俺は、クエリそのものを検査することにした。 // すべてのパラメータマーカを取得する。 preg_match_all('/(:[\w]+)/', $sql, $matches); // パラメータマーカの出現回数を得る。 $param = array_count_values($matches[1]); // 2回以上出現したパラメータマーカを調べる。 foreach($param as $key => $val) { if($val > 1) { echo "パラメータマーカ {$key} を {$val} 個検出しました。"; // ここでエラーを発生させるか、強制終了する。 } } こんな感じのロジックをPDOを継承したクラスに仕込んでおけばOK。 class dao extends PDO { const DAO_ERROR_PARAMETER_MARKER_DUPLICATED = 777; // 今回必要なところだけ記述 public function prepare($statement, $options = array()) { preg_match_all('/(:[\w]+)/', $sql, $matches); $param = array_count_values($matches[1]); foreach($param as $key => $val) { if($val > 1) { // エラーモードに応じて、例外を発生させるか、falseを返す。 $err_mode = $this->getAttribute(PDO::ATTR_ERRMODE); ...