- PR -

【ASP.NET】セッション変数の値を外部で利用する方法

投稿者投稿内容
ひろれい
ぬし
会議室デビュー日: 2006/03/02
投稿数: 486
お住まい・勤務地: 万博開催地
投稿日時: 2006-05-11 16:18
ASP.NET(VB.NET)&Oracle で開発しております。

現在開発しているWebシステムで、Oracle の TRIGGER を利用して、UPDATE と DELETE のログを採取しようと考えております。
要は、画面上でいつ誰がどういう処理(UPDATE・DELETE)をしたかを記録したいのです。

そこで問題となっているのが、「どのユーザが処理をしたか」という情報が取れない、という点です。ここで言う「ユーザ」というのは、OSのログインユーザではなく、開発中のシステムにログインしているユーザのことを指します。
(ログイン完了後、Session変数に保持しています)

UPDATE は、UPDATE するテーブルに「更新ユーザID」という列があるので、これを利用すれば可能なのですが、問題は DELETE です。物理削除してしまいますので・・・

こういった場合は、アプリの方で、DELETE の時だけログをはくようにするしか無いのでしょうか?
みなさんのお知恵をお借りしたいと思い、掲載した次第です。

よろしくお願い致します。

編集 : 件名が内容とあまりリンクしていませんね。申し訳ありません。

[ メッセージ編集済み 編集者: ひろれい 編集日時 2006-05-11 16:26 ]
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2006-05-11 16:37
引用:

ひろれいさんの書き込み (2006-05-11 16:18) より:

UPDATE は、UPDATE するテーブルに「更新ユーザID」という列があるので、これを利用すれば可能なのですが、問題は DELETE です。物理削除してしまいますので・・・

こういった場合は、アプリの方で、DELETE の時だけログをはくようにするしか無いのでしょうか?


UPDATE の場合も列から取ると、
最終更新者しかわからないことになってしまいませんか?

DELETEでログを出力するつもりなら、
更新や追加でも同様にログを出力するようにしたほうがいいかも
ひろれい
ぬし
会議室デビュー日: 2006/03/02
投稿数: 486
お住まい・勤務地: 万博開催地
投稿日時: 2006-05-11 17:04
引用:

かるあさんの書き込み (2006-05-11 16:37) より:

UPDATE の場合も列から取ると、
最終更新者しかわからないことになってしまいませんか?


かるあさん、お返事ありがとうございます。

はい。ログなので、その時に UPDATE した人(最終更新者)さえ分かれば良いのです。
ログテーブルには、UPDATE もしくは DELETE が行なわれた都度、レコードを作成していきますので。
ちなみに、ログのレコードには更新前データと更新後データの両方を出力します。

引用:

DELETEでログを出力するつもりなら、
更新や追加でも同様にログを出力するようにしたほうがいいかも


追加は、アップロード処理があって、ログを取り出すとあっという間にログ件数が大量になってしまうため、見送りました。

本当は、ログ採取方法は統一したいのです。
出来れば、工数が少ない TRIGGER で統一したいと考えています。
(今からアプリの更新と削除に全対応すると大変な工数になりますので・・・)

ただ、DELETE の場合の最終処理者が取得できないため、困っている次第です。
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2006-05-11 17:27
引用:

ひろれいさんの書き込み (2006-05-11 17:04) より:

本当は、ログ採取方法は統一したいのです。
出来れば、工数が少ない TRIGGER で統一したいと考えています。
(今からアプリの更新と削除に全対応すると大変な工数になりますので・・・)

ただ、DELETE の場合の最終処理者が取得できないため、困っている次第です。


あっすみません。勘違いしていました。
UPDATE/DELETE のときに TRIGGER の中で
更新ログを出力したいっていうことですね。

うーん
すみません良い手が思いつきません。
雲山
会議室デビュー日: 2005/01/17
投稿数: 17
お住まい・勤務地: 流浪の砂布巾
投稿日時: 2006-05-11 18:03
ひろれいさんの立ち位置を推測すると、UPDATE/DELETE処理自体には手を出せない立場ということなんでしょうか?

ちなみにトリガーはBEFOREもしくはAFTERの指定ができます。
INSTEAD OFでトリガーだけ発行もできます

ただDELETE文だけの場合、「更新ユーザID」列は当然古いままなので、もう一工夫いりますね・・・

ひろれい
ぬし
会議室デビュー日: 2006/03/02
投稿数: 486
お住まい・勤務地: 万博開催地
投稿日時: 2006-05-11 20:37
引用:

雲山さんの書き込み (2006-05-11 18:03) より:

ひろれいさんの立ち位置を推測すると、UPDATE/DELETE処理自体には手を出せない立場ということなんでしょうか?


雲山さん、お返事ありがとうございます。
いいえ、手は出せますよ。ただ、修正箇所がそれなりにあるので、出来る限りソースは修正したくないな、と。製造・単体テストがある程度終わっているので、戻り工数が多くなってしまいますし。TRIGGER で対応できれば、そちらのテストで済みますよね。

引用:

ちなみにトリガーはBEFOREもしくはAFTERの指定ができます。
INSTEAD OFでトリガーだけ発行もできます

ただDELETE文だけの場合、「更新ユーザID」列は当然古いままなので、もう一工夫いりますね・・・


TRIGGER 自体は作成できているので、後は deleting 時に設定するユーザIDだけなのです。
その「もう一工夫」で何か良い手がないかと考えているのですが、なかなか難しいですね・・・
どっとねっとふぁん
ぬし
会議室デビュー日: 2005/02/23
投稿数: 935
投稿日時: 2006-05-11 21:15
ちょっと視点が変わりますが。

HttpModuleを使ってみるのはどうでしょう。
UpdateやDeleteの際のリクエストのパターンを全部洗い出す必要はあるかもしれませんが、現行のソースに何も手を加えず、ユーザの操作をロギングできるかと思います。
Session変数の状態がきちんと格納されてからとなると、PreRequestHandlerExecuteイベントに対して独自の処理メソッドを実行するような形になるでしょう。
このイベントはページの処理がはじまる直前に発生するので、この時点でブラウザからのリクエストの内容を確認し、UpdateやDeleteのパターンに一致する場合にSession変数内のユーザ情報とリクエストのなかから必要なデータを取り出してログに残すことができるはずです。
Access
ぬし
会議室デビュー日: 2002/04/08
投稿数: 829
投稿日時: 2006-05-12 06:13
引用:

UPDATE は、UPDATE するテーブルに「更新ユーザID」という列があるので、これを利用すれば可能なのですが、問題は DELETE です。物理削除してしまいますので・・・

こういった場合は、アプリの方で、DELETE の時だけログをはくようにするしか無いのでしょうか?



欧米の政府関係のシステムでは会計監査上の理由で、テーブルからレコードを物理的に削除することは禁止されているようです。削除フラグを付けて論理削除するのが一般的なようです。

グーグルで検索したら同じような記事がありました。英語ですが、よろしければ参考にしてください。

http://www.developerfusion.co.uk/show/2413/


_________________
ASP.NET+Ajaxサンプル集 | JavaScript+Ajaxサンプル集

スキルアップ/キャリアアップ(JOB@IT)