ASP Classic Webapp - подключение к другой базе данных SQL через логин - PullRequest
1 голос
/ 17 июля 2009

Нужен способ подключения к уникальной базе данных SQL через логин в ASP classic.

НАСТРОЙКА

  • Веб-приложение: ASP classic / SQL 2005.
  • Webapp хранит информацию для нескольких компаний.
  • Все данные хранятся в одном главном SQL 2005. Все базы данных будут на одном сервере.
  • Каждый пользователь имеет уникальный логин (компания, идентификатор пользователя, пароль)
  • Соединение с главным файлом базы данных с использованием соединения без DSN
  • IE: (dbConn.Open "driver = {SQL Server}; сервер = 11.22.333.444; база данных = mywebdb", "mylogin", "mypassword")

НЕОБХОДИМОСТЬ:

Хотите разделить компании на собственные базы данных. Когда пользователь входит в систему, название компании скажет приложению использовать уникальное соединение базы данных SQL для каждой компании.

Поскольку динамические включаемые файлы не являются опцией, какой путь лучше выбрать?

Спасибо!

Ответы [ 2 ]

1 голос
/ 17 июля 2009

Строка соединения должна храниться где-нибудь, верно? Я думаю, включаю .asp.

Добавьте код, который включает в себя, чтобы проверить название компании (сохранено в сеансе?) И исправить строку подключения соответствующим образом.

Редактировать

Проблема в том, что у вас может быть код на множестве разных ASP-страниц, который предполагает, что соответствующая строка соединения доступна в переменной, объявленной в вашем включаемом файле db.asp (давайте назовем его m_connStr). Вам не нужно изменять все эти страницы, чтобы соответствовать этому новому требованию.

Таким образом, вы хотите отредактировать только файл включения db.asp и просто хотите, чтобы m_connStr волшебным образом указывал на правильную БД.

Создайте страницу входа, когда вы знаете, что компания задает имя базы данных в переменной Session.

Ваш существующий код имеет строку подключения, подобную этой: -

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-страниц, все работает как обычно, но строка соединения будет меняться в зависимости от сеанса в зависимости от компании, связанной с вошедшим в систему пользователем.

0 голосов
/ 17 июля 2009

Как только вы это сделаете, вы в конечном итоге измените строку подключения в зависимости от ввода пользователя. Не используйте пользовательский ввод напрямую, а проверяйте его по списку допустимых значений. Я предлагаю инструкцию 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

Имейте в виду, что это приведет к проблемам, если у вас есть пользователи, которые захотят открыть одну компанию на одной вкладке, а другую - на другой. Им будет интересно, почему они могут видеть только информацию о компании, в которую они недавно вошли.

Если это будет проблемой, вы, вероятно, захотите передать токен в строке запроса для каждой ссылки. Это добавляет сложности, но не очень сильно (кроме утомительной задачи изменения каждой ссылки). Тогда это будет выглядеть так:

' 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». Сделав это успешно, они получают переменную сеанса с именем "company1 - db", которая содержит имя базы данных (в данном случае, "company1DBName").

Теперь каждая ссылка, по которой они следуют, должна иметь строку запроса, например "? CompanyToken = company1". Поэтому, когда вы подключаетесь к базе данных, вы берете этот токен и используете его для поиска правильного имени базы данных: Session ("company1 "+" - db ") =" company1DBName "

Если они еще не вошли в эту компанию (или если они просто составляют название компании), у них не будет этой переменной сеанса, и они должны перейти к экрану входа в систему.

Если они регистрируются под двумя компаниями одновременно, теперь вы можете справиться с этим, потому что вы будете получать имя базы данных для каждой ссылки.

Имеет смысл?

Что бы вы ни делали, не используйте пользовательский ввод для непосредственного создания строки подключения. Другими словами, следующее является неправильным путем :

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

Удачи!

...