2010年3月21日日曜日

SQL Sqrver 2005でトリガーを利用してデータベースの変更を記録する

SQL Serverであるテーブルの操作のログを取りたいと考えています。

単に「更新されました」とか「削除されました」というログではなく、もともとAというデータがBに変更されましたという具合にデータも含めたログを取ります。

アプリケーション側で実装することもできますが、メンテナンス性が悪いのでSQLのトリガーを使った方法を解説します。

 

データベースの準備

SQL Serverにデータベースを作成します。

テーブルの準備

2つのテーブルを準備します。1つはtbl社員、もう1つはtbl社員ログとします。

スキーマは簡単に次のようにします。

tbl社員 tbl社員ログ
ID (PK、int) ID (PK、int)
氏名(nvarchar(50)) 氏名(nvarchar(50))

トリガーの作成

テーブルtbl社員に行の追加、更新があればtbl社員ログに更新前のデータと更新後のデータをコピーするようにします。

SQL Server 2005 Management Studioを開いてtbl社員の+をクリックして展開します。トリガという項目がありますので、右クリックして「新しいトリガ」を選択します。

(ほかにプログラムという項目にデータベーストリガというのがありますが、こちらと間違えないようにします。)

右側ペインにトリガーのテンプレートが表示されますので、すべて削除します。

次のようにトリガーを入力します。

CREATE TRIGGER トリガーサンプル ON tbl社員

AFTER INSERT, UPDATE

AS

BEGIN

INSERT INTO tbl社員ログ(氏名) SELECT 氏名 FROM deleted

INSERT INTO tbl社員ログ(氏名) SELECT 氏名 FROM inserted

END

入力が完了したら「実行」をクリックします。

「コマンドが正常に終了しました。」となれば完了です。

トリガーの解説

1行目の

「CREATE TRIGGER トリガーサンプル ON tbl社員」はトリガーの作成を指示していて、トリガーの名前とどのテーブルでトリガーを使うかを示しています。

2行目の

「AFTER INSERT, UPDATE」はトリガーの実行されるタイミングを指示しています。(INSERT、UPDATE、DELETEが指定できます。SELECTは指定できません。)

3行目のAS句はお約束で付けます。AS句以降がトリガーの処理になります。

4行目のBEGINはENDとペアになっていて処理をグループ化します。INSERT文が2行ありますが、BEGIN~ENDを使わないと初めのINSERT文しか処理されません。

5行目の

「INSERT INTO tbl社員ログ(氏名) SELECT 氏名 FROM deleted」はSQL文です。SELECT文で射影された値をINSERT文に渡して行の追加を実行しています。

deletedというテーブルは削除される値、更新で上書きされる値が格納されている擬似的なテーブルです。

6行目も5行目と同様です。

insertedというテーブルがありますが、これは追加される値、あるいは更新で上書きする値が格納される擬似的なテーブルです。

deletedとinsertedを利用すると変更前、変更後の値にアクセスができるということです。(deletedがあるおかげでBEGIN UPDATEで事前に別のトリガーを呼び出して変更前のデータを取得しなくてよいので気が利いています。)

その他

トリガーは再起動などしてもいつでも動くようになっています。

INSERT文に項目を追加すれば「追加されました」などのコメントも出力できます。

もっと複雑な処理をするためにAS句以降にストアドプロシージャを実行することもできます。が、あまり複雑なことをするのはメンテナンス性を損なうのでほどほどにというのが良い設計のようです。

2010年2月23日火曜日

回復コンソールでデータを抜き取る

起動しなくなったPCからデータを抜き出す場合いくつかの手法がありますが、回復コンソールを使った場合のデータ抜き取りの小技を紹介します。

回復コンソールでPCを起動する前にUSBハードディスクを取り付けておきます。

回復コンソールが起動したらMAPコマンドを実行。
おそらくUSBハードディスクが認識されているはずです。

USBハードディスクはドライブルートのみ書き込みが可能ですがデータの抜き取りにはなんとか使えるでしょう。

ちなみにUSBメモリは認識されますが書き込みできません。
これはセキュリティーポリシーの設定によるものなのでWindowsが起動しているうちに事前にポリシーを変更しておけば書き込み可能なのですが、いざ、起動しない段階ではどうしようもありません。

USBメモリが使えない理由はUSBメモリとUSBハードディスクのメディアとしての取り扱いが異なるため適用されるポリシーも異なるからです。
USBメモリはリムーバブルメディアとして認識され、USBハードディスクはハードディスクとして認識されます。
回復コンソールでSETコマンドを実行すると
AllowRemobableMedia=FALSE
AllowAllPath=FALSE
となっているのが確認できます。
リムバブルディスクは不許可、サブフォルダも不許可であることが分かります。

2010年2月14日日曜日

WindowsXPでGuestアカウントが有効でもパスワードを求められる

WindowsXPでファイル共有がうまく行かなかった1つのケースを紹介します。

WindowsXPでファイルを共有していましたが、ある日突然共有フォルダにアクセスするとパスワードを求められるようになりました。
ファイルを共有しているPCのGuestアカウントは有効になっているため本来なら認証を求められることはありません。しかも、アカウントを入力しようにもGuestがすでに入力された状態でグレーになっていてアカウントの入力ができない状態になっています。

アカウントGuestのまま、パスワードを空白でOKをクリックするとPCにはログインできてフォルダの一覧が表示されます。しかし、フォルダをクリックすると「このコマンドを処理するのに必要な記憶領域をサーバーで確保できません。」というエラーが発生。

いままでにもXP Homeなのにパスワードを求められたり、今回のようにGuestが有効なのにパスワードを求められることがありました。原因はウイルスソフトのインストールによるIRPStackSizeの不足と判明しました。

http://support.microsoft.com/kb/177078/ja

にて詳細と復帰の方法が記載してありますので参考にしてください。

また、レジストリの編集は十分注意してください。

WebDAVへの接続ができない場合の対処

Windows XPでWebDAVへの接続を追加しようとすると次のようなエラーが表示されて接続を作成できないことがある。
「入力したフォルダは有効ではないようです。別のフォルダを選択してください。」
この場合次のように対応する。

1、ファイル名を指定して実行より「webfldrs.msi」と入力しOKをクリックする。
2、「Select reinstall」を選択する。
3、つぎの項目にチェックを入れる。
  • Repair all detected reinstall problems
  • Force all files to be reinstalled,regardless of checksum or version
  • Veryfy that required user registry entries are present
  • Veryfy that required local machine registry entries are oresent
4、「OK」をクリック。
5、「Reinstall」をクリック。

この操作の後、管理ツールのサービスでWebClientサービスを停止させる。

以上の操作でWebDAVの接続の追加ができるようになります。

2010年2月13日土曜日

システムリソースの確認方法

WindowsXPではシステムリソースを確認するためのリソースメーターがありません。
通常はリソースの使用状況を確認する必要はありませんが、ひとたびリソース不足のエラーが出るとリソースを確認する方法が欲しくなります。
リソースの確認のためのツールでお勧めなのはMicrosoftが配布しているProcess Explorerです。
Process ExplorerはXPだけでなくVista Windows7でも動作します。また、インストール不要です。
Process Explorerは、http://technet.microsoft.com/ja-jp/sysinternals/bb896653.aspxよりダウンロードできます。
英語版ですが使い方は簡単です。(日本語化するツールのあるようですが必要を感じません)
ダウンロードしたファイルを解凍してprocexp.exeをクリックすればProcess Explorerが起動します。

デフォルトではリソースの利用状況は表示されません。
表示のためには、Process、PIDと並んでいるタイトル部分を右クリックしてSelect columns...メニューを開きます。
メニューよりProcess Memoryタブを開き、下のほうにあるGDI ObjectとUSER Objectにチェックを入れます。

この2つがWindows98などのリソースメーターに表示されていたリソースに相当します。
リソース不足のエラーの場合、ほとんどはソフトの不具合によりますのでリソースを無駄使いしているソフトをアンインストールすることでリソース不足のエラーを回避することが可能です。

Proxyソフト Delegateのログファイルの無効化

Windows版のDelegateではデフォルトでログファイルが生成されます。
DelegateはWebへのアクセスを制限するフィルタタイプのProxyというより、ソフトウェアルーターという位置付けと思われます。
よってデバッグ以外の目的でログを利用することがあまりありません。
ログは自動的に消去されませんので、いずれハードディスクを使い切ってしまいます。
そこでログファイルの生成をしないように設定します。
Delegateのcfgファイルをつぎのように記述します。
http.cfg
-P=80
SERVER=http
LOGFILE=””
MANAGER=http@mail.com

ミソはLOGFILE=""の一行です。
この一行を付けることでログファイルの生成が停止されます。

この例ではHTTPのログについて生成されなくなります。
必要に応じてsmtpやpopのcfgファイルも変更してログを生成しないようにします。

2010年2月6日土曜日

Windows 7のオフライン共有

Windows7でオフライン共有は改良されて狭帯域での使用などが考慮されて使いやすなっています。

仕事が直行直帰が多いので外出先や自宅でサーバーのファイルを閲覧、編集したいことが多いのでWindows XP時代からオフライン共有にはお世話になっていました。

Windows 7ではデフォルトでオフライン共有は無効になっています。オフライン共有を使うためにはオフライン共有を有効にする必要があります。

手順は、「スタートメニュー」-「プログラムとファイルの検索」に”オフラインファイル”と入力します。(Enterは押下しません)


「オフラインファイルの管理」が検索されますのでクリックします。


「オフラインを有効にする」をクリックして、再起動します。



再度、 、「スタートメニュー」-「プログラムとファイルの検索」に”オフラインファイル”と入力します。(Enterは押下しません)



今度は、「オフラインファイルの暗号化」「オフラインファイルによるディスク領域の使用管理」の項目が追加されていることがわかります。

これで、オフライン共有が利用可能になりましたので、オフライン共有したいネットワーク上のフォルダを右クリックします。

メニューに「常にオフラインで使用する」を選択します。

同期が始まります。

以上で作業は終了です。複数のフォルダをオフライン共有したい場合は、ほかのフォルダも同様に作業します。

目的のフォルダのショートカットを作成しておくと便利です。



本丸サーバーと持ち出し用PCでファイルが2重化されるのでバックアップの意味合いもあります。

PCの紛失、盗難もありますので暗号化をしておくことをお勧めします。

2010年2月5日金曜日

Windows Vista Windows 7からWindows 2000 Serverの共有フォルダにアクセスできない


Windows Vista Windows 7ではサーバーアクセスの際の認証にNTLMv2認証が使われます。 Windows 2000 ServerはNTLM認証が使われています。 Vista、7から2000Serverにアクセスする際には、この認証の整合性が取れないため正しいアカウント情報を入力しても認証されず、認証画面が表示されつづける状態になります。 Windows 2000 SeerverもNTLMv2認証に対応しているためサーバー側をNTLMv2認証を使うように変更するか、Viata、7NTLM認証を使うように変更する必要があります。 サーバー側を変更できない場合はVista、7側を変更するしかありません。 Vista、7側のNTLM認証への変更手順は
  1. 「コントロールパネル」-「管理ツール」-「ローカルセキュリティポリシー」を開きます。
  2. 左側のペインより、「ローカルポリシー」-「セキュリティオプション」
  3. 右側のペインより、「ネットワークセキュリティ:LAN Manager認証レベル」をダブルクリックします。
  4. 「NTLM応答のみに送信する」を選択する

2010年1月30日土曜日

Windows7のカスタム用紙サイズの設定

Windows7はデザイン部分では殆どVistaを継承しているものの若干はちがっている。
用紙サイズの作成が見つからず探したところ、
「コントロールパネル」-「管理ツール」-「印刷の管理」という項目があり、こちらから行うことになる。


印刷の管理を開いて見るといくつかの項目が参照、設定できることがわかる。
残念なことに、あまり大したことが設定できるわけでもなくXPの「プリンタとFAXのプロパティ」で十分と思われた。


用紙のアイコンを右クリックして「用紙の管理」をクリックすると用紙サイズの作成ができる。
この画面はXP時代と全く変化がない。用紙サイズの作成については以前と同じ画面なので戸惑うことはないものの表示される用紙が4つしか表示できず、標準で設定されている用紙も多いので目的の用紙を探すのに骨が折れる。ここは改善して欲しかった。


いずれにしてもWindows7での用紙サイズの作成は「コントロールパネル」-「管理ツール」-「印刷の管理」から行うということになる。

2010年1月21日木曜日

システムリソースが不足しているため、要求されたサービスを完了できません。

Windows XPの「システムリソースが不足しているため、要求されたサービスを完了できません。」のエラーに対する対応方法は、対症療法的にレジストリでリソースの量を増やします。

レジストリエディタで次のキーを探します

HKEY_LOCAL_MACHINE¥SYSTEM¥CurrentControlSet¥Control¥SessionManager¥SubSystem

Windowsというキーの値が3072になっていますがこれを増やします 。
(「SharedSection=1024,3072,512」の部分を「3072」(3MB)から「6144」(6MB)に変更して「OK」ボタンをクリックする。この値は256の整数倍で指定する。 )


4096か5120、6144あたりに増やします。

(単純に256の倍数です。3072≒3MBなので4MBあるいは5MBということです。)

XPは標準ではリソースを確認するツールはありません。
(Microsoftが配布しているProcess Explorerというツールと使えば確認できます)

リソースはWindowsが各プロセスを管理するためのメモリ領域で初期値は3072KBです。
メモリの量を増やしてもリソースに割り当てられたメモリが増えるわけではないのでリソースを使いきった段階でエラーが出たりシステムが不安定になります。

作りの甘いアプリケーションはリソースを無駄にします。
何らかのアプリケーションを起動している最中にリソース不足のエラーが出る場合は、そのアプリケーションを疑うべきです。
特にメモリリーク(リソースリーク)の場合はシステムリソースの量を増やしても、時間がたつにつれていずれはエラーが出てしまいます。

メモリが安価になったため大きく増やせばよいかというと、かなずしもそうではないようです。コツとしてはすこしづつ増やしてください。

2010年1月17日日曜日

YAHAMAルーターのファームのバージョンアップ

YAMAHAルーターのファームウェアのバージョンアップはTFTPにて行います
次の手順にてバージョンアップします

事前準備
YAMAHAサイトにてファームウェアをダウンロードしておきます

ファームアップ手順
telnetでルーターにログオンします
tftpを利用できるように「tftp host Any」コマンドを実行
telnetを終了
「tftp -i ルーターIPアドレス put rtxxxxx.bin(ファームファイル名) exec」コマンドを実行

注意点
tftpコマンドでファームのバイナリふぁルーターに転送されたのち、ルーター内部でファームの更新が行われます。この時、tftpコマンドがタイムアウトを返すことがありますが、ルーターの電源をOFFにしないようにします。もしタイムアウトになった場合は2、3分放置したうえでルーターのランプが点滅していないことを確認したうえでtelnetでアクセスしてみます。正常に応答すればファームの書き換えは成功あるいは失敗で完了しています。応答がないうちは電源のOFFをしないで10分程度放置して電源をOFF、ONしてみます。

YAMAHA RTXシリーズのネットボランチDNSの登録

YAMAHAの提供しているボランチネットDNSの登録は以下のように実行します。

ボランチネットDNSはインターネット上からルーターのWAN側アドレスを探すことがほとんどと思われるので、インターネット接続のための設定がPP1に設定されていることを想定しています。

以下コマンド

pp select 1
netvolante-dns hostname host pp [取得するホスト名]
netvolante-dns go pp 1
[ホスト名.xxx.volantenet.jp]を登録しました。
新しい接続を保存しますか(Y/N)Y
セーブ中...終了

解説
pp select 1
(インターネット接続用のPP1にボランチネットDNSのホスト名を関連付けるためPP1を選択)
netvolante-dns hostname host pp [取得するホスト名]
(希望するホスト名を指定します)
netvolante-dns go pp 1
(登録を実行します)
[ホスト名.xxx.volantenet.jp]を登録しました。
新しい接続を保存しますか(Y/N)Y
(正常に登録されると保存を聞いてきます。Yを入力します)
セーブ中...終了

設定は以上です

PP1に以下のコマンドが追加されます

netvolante-dns use pp auto
netvolante-dns hostname host pp [取得するホスト名]

注意点
ルーターのファームウェアのバージョンによって登録後の応答が若干異なります
取得するアドレスは「ホスト名+xxx+volantenet.jp」となりますが、xxxの部分はルーターによって異なります。xxxはルーターのMACアドレスによって異なるため、べつのルーターにすでに取得したホスト名を設定することはできません。

2010年1月11日月曜日

Windows7でのtelnetの利用


Windows7ではデフォルトでtelnetを利用することができませんでした。
一般の方はtelnetを利用する機会は少ないと思われますが、仕事柄ルーターの設定などがあるので私にはtelnetは必須アイテムです。

そこで、Windows7でtelnetを利用する順ですが、
「コントロールパネル」-「プログラムと機能」-「Windowsの機能の有効化または無効化」よりtelnetクライアントにチェックを入れて「OK」をクリックします。
設定が完了するとtelnetが利用できるようになります。

XPモードのアプリケーションインストール


Windows7のXPモードでアプリケーションのインストールを実行すると、「Windowsインストーラは、リモートすくトップ接続からのインストールを許可していません。」とエラーになることがあります。
原因はインストーラがWindows7のドライブに保存されているためです。エラーの内容を鵜呑みにするとハマってしまいます。
この場合はXPモードのデスクトップなどにインストーラをコピーしてから実行することで問題なくインストールできます。