無料で作るASP.NETでWebサイト(8)―アクセスカウンタ設置編(2)

前回は、開発環境にアクセスカウンタを設置するまでを取り上げた。今回は、本番環境にアクセスカウンタを設置してみることにする。本番環境への設置については、本番環境でデータベースの設定、本番環境に向けたCennectionString(Web.configファイル)の作成がメインになる。すでに作成したWebページは、そのまま使える。では、行ってみよう。

前の記事へ:無料で作るASP.NETでWebサイト(7)―アクセスカウンタ設置編(1)
次の記事へ:無料で作るASP.NETでWebサイト(9)

最初に断っておくと、この作業は完全に本番環境のデータベース仕様に依存する。なので、あくまでもファーストサーバのエクスプレス2の例だと思っておいて欲しい。お断りを入れたところで、エクスプレス2のデータベース仕様を見てみる。すると、ADO.NETによるSystem.Data.SqlClientクラスを使い、さらにデータベース接続文字列に「ホスト名、データベース名、ユーザ名、パスワード」の組み合わせを使うことが指定されている。ホスト名とデータベース名は指定されており、さらにユーザ名とパスワードも決まっているから、事実上選択の余地はないことになる。とにかく、これを使うしかないわけだ。

エクスプレス2では、データベース管理のためのWebブラウザベースのツールが提供されている。myLittleAdminというツールだ。このツールで、本番環境のSQL Server 2005を使用することができる。内部のインタフェースは、基本的にVisual Studio(Visual Web Developer)のデータベースマネージャと相違ない。テーブルの作成、ストアドプロシージャの作成を、同様に行うことができる。ただし、ストアドプロシージャについてはあらかじめ雛形が提示され、それにコードを足していくことになる。今回は、以下のようなコードになった。ちょっと雰囲気は違うが、基本的に開発環境に作成したものと変わりない。

これで、あとはデータベース接続文字列を作ってやれば終わりと思ったら、そんなに甘くない。本番環境ではセキュリティが厳しい。作成したストアドプロシージャにASP.NETからの実行許可を与えないと実行できない。これには、「データベース」ショートカットにある「ユーザーデータベース」→「DB_ユーザ名」→「セキュリティ」→「スキーマ」を開く。するとスキーマの一覧が表示されるので、「dbo」を選ぶ。実は、これは前にストアドプロシージャを作成した際のスキーマだ(特にスキーマをしてしない場合にはdboとなる)。「dbo」をクリックするとメニューが開くので、「権限」を選ぶ。すると権限の一覧が表示されるので、「ユーザーまたはロール」から「L_ユーザ名」を選ぶ。このユーザ名はデータベースアクセスに使用されるユーザ名で、myLittleAdminを操作しているユーザと同じだ。この状態で、「許可」と「許可の有無」の双方にすべてチェックを入れる(「許可の有無」にチェックを入れると、「許可」にも自動的にチェックが入る)。厳密には「EXECUTE」のみに許可を出すだけでもよい。これで「OK」を押して保存すれば、スキーマdboのユーザ「L_ユーザ名」について実行許可が出たことになる。

ところでスキーマ(schema)とは日本人には馴染みにくい概念である。最近やたらとこういう用語が出てきて辟易しているが、今回のスキーマはユーザーやグループをまとめた上位の概念ということらしい。たとえばストアドプロシージャの場合ならこの場合dboスキーマということになっているが、これをユーザやグループに直接結び付けてしまうと、ユーザが変わる場合、ユーザの権限が変わる場合にひとつひとつストアドプロシージャの設定を変更しなければならない。しかしスキーマでまとめておけば、今回のようにスキーマ内部の設定変更で済む。こういう利点があるのを忘れてはなるまい。

本番環境側の準備ができたら、データベース接続文字列を作成しよう。これはエクスプレス2で指定されているので、以下のようにそのままWeb.configのconnectionStringsの内部に記述する。ちなみに、データベースサーバのDBSERVER、データベース名のDB_user、ユーザ名のL_user、パスワードのpasswordはすべて仮である。

ポイントは、name属性の「ConnectionString」を開発環境と同じにしておくことだ。これにより、Webページ側のSqlDataSourceサーバコントロール側の設定を変更せずに、Web.configの記述だけ書き換えるだけで開発環境と本番環境の双方に対応できる。両方記述しておき、コメントアウトでどちらかを無効化する、というようにしておけばいいだろう。

めでたくアクセスカウンタの仕組みを取り入れることができたので、次回からはいよいよHealthメニューの下を実装していこう。

<add name="ConnectionString" connectionString="server=DBSERVER; database=DB_user; User ID=L_user; Pwd=password; " providerName="System.Data.SqlClient" />

SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
GO

— ================================
— Created
—    by: ユーザ名
—    on: Monday, March 26, 2007 12:38 PM
— Description: <Description>
— ================================
CREATE PROCEDURE CountUp
   — Add the parameters for the procedure here
  @ckey VARCHAR(10)
AS
BEGIN
   SET NOCOUNT ON;

   — Insert statements for procedure here
  IF EXISTS (SELECT * FROM Counter WHERE ckey = @ckey)
    BEGIN
      UPDATE Counter SET value = value+1 WHERE ckey = @ckey
    END
  ELSE
    BEGIN
      INSERT INTO Counter(ckey, value) VALUES(@ckey,1)
    END

  SELECT value FROM Counter WHERE ckey = @ckey

END

コメント