1

ASPクラシックのログインを介して一意のSQLデータベースに接続する方法が必要です。

セットアップ

  • Webapp:ASPクラシック/SQL2005。
  • Webappは、複数の企業の情報を保存します。
  • すべてのデータは1つのマスターSQL2005に保存されます。すべてのデータベースは同じサーバー上にあります。
  • 各ユーザーは一意のログイン(会社、ユーザーID、パスワード)を持っています
  • DSNなしの接続を使用したマスターデータベースインクルードファイルとの接続
  • IE:(dbConn.Open "driver = {SQL Server}; server = 11.22.333.444; database = mywebdb"、 "mylogin"、 "mypassword")

必要なもの:

会社を独自のデータベースに分割したい。ユーザーがログインすると、会社名はAPPに会社ごとに一意のSQLデータベース接続を使用するように指示します。

動的インクルードファイルはオプションではないので、最適なルートは何ですか?

ありがとうございました!

4

2 に答える 2

1

接続文字列はどこかに保存する必要がありますか? インクルード .asp だと思います。

そのインクルードにコードを追加して、会社名 (セッションに保存されていますか?) を調べ、それに応じて接続文字列を修正します。

編集

問題は、db.asp インクルード ファイル (m_connStr と呼びましょう) で宣言された変数で適切な接続文字列が使用可能であることを前提とする、無数の異なる ASP ページにコードが存在する可能性があることです。この新しい要件を満たすために、これらすべてのページを変更する必要はありません。

したがって、db.asp インクルード ファイルのみを編集し、m_connStr が魔法のように正しい DB を指すようにするだけです。

会社がセッション変数にデータベース名を設定したことがわかったら、ログオン ページを作成します。

既存のコードには、次のような接続文字列があります:-

m_connStr = "driver={SQL Server};server=11.22.333.444 database=mywebdb", "mylogin", "mypassword"

そこで、テンプレートを使用します:-

m_connStrTemplate = "driver={SQL Server};server=11.22.333.444 database=%db%", "mylogin", "mypassword"

If Session("database") <> "" Then
    m_connStr = Replace(m_connStrTemplate, "%db%", Session("database"))
End If

存在しないデータベース セッション変数によって接続文字列が定義されないため、誤って既定のデータベースに接続することはありません。

すべての ASP ページに関する限り、これは通常どおりのビジネスですが、接続文字列は、ログオンしているユーザーに関連付けられている会社に応じてセッションごとに異なります。

于 2009-07-17T16:24:05.713 に答える
0

どのように実行しても、ユーザー入力に基づいて接続文字列を変更することになります。ユーザー入力を直接使用しないでください。ただし、許容値のリストに対して検証してください。これを行うには、 Select Case ステートメントをお勧めします。

' Do this when logging in: '
Dim companyName
companyName = Request.Form("companyName")

Select Case companyName
Case "company1"
    Session("companyDB") = "company1"
Case "company2"
    Session("companyDB") = "company2"
Case Else
    Session.Contents.Remove("companyDB")
    ' Invalid login! '
End Select

' Do this when connecting to the database: '
Dim connectionString
If Session("companyDB") Then
    connectionString = "...database=" & Session("companyDB") & "..."
Else
    '  Invalid login, go log in again '
End If

ある会社を 1 つのタブで開き、別の会社を別のタブで開きたいユーザーがいる場合、これは問題を引き起こすことに注意してください。最近ログインした会社の情報しか表示されないのはなぜかと疑問に思うでしょう。

これが問題になる場合は、各リンクのクエリ文字列でトークンを渡したいと思うでしょう。これにより複雑さが増しますが、それほど大きくはありません (すべてのリンクを変更するという面倒な作業を除けば)。次に、次のようになります。

' Do this when logging in: '
Dim companyName
companyName = Request.Form("companyName")

Select Case companyName
Case "company1"
    Session("company1 - db") = "company1DBName"
Case "company2"
    Session("company2 - db") = "company2DBName"
Case Else
    ' Invalid login! '
End Select


' Do this when connecting to the database: '
Dim connectionString, companyToken
companyToken = Request("companyToken")
If Session(companyToken & " - db") Then
    connectionString = "...database=" & Session(companyToken & " - db") & "..."
Else
    '  Invalid login, go log in again
End If

これは、簡単にするために、トークンが会社名と同じであることを前提としています。たとえば、誰かが「company1」にログインします。正常に完了すると、データベースの名前 (この場合は「company1DBName」) を含む「company1 - db」というセッション変数を取得します。

ここで、ユーザーがたどるすべてのリンクには、"?companyToken=company1" のようなクエリ文字列が含まれている必要があります。したがって、データベースに接続するときは、そのトークンを取得し、それを使用して正しいデータベース名を見つけます: Session("company1" + " - デシベル") = "company1DBName"

その会社にまだログインしていない場合 (または単に会社名を作っただけの場合) は、そのセッション変数を持っていないため、ログイン画面に移動する必要があります。

一度に 2 つの会社でログインしても、すべてのリンクでデータベース名を取得できるため、これで対処できます。

わかる?

何をするにしても、ユーザー入力を使用して接続文字列を直接作成しないでください。つまり、次の方法は間違っています

Dim connectionString
connectionString = "...database=" & Request.Form("companyDB") & "..."

幸運を!

于 2009-07-17T16:23:58.290 に答える