1

ASP classic의 로그인을 통해 고유 한 SQL DB에 연결하는 방법이 필요합니다.ASP Classic Webapp - 로그인을 통해 다른 SQL DB에 연결

설치

  • 웹 애플리케이션 : 여러 회사의 ASP/고전 SQL 2005
  • 웹 애플리케이션 정보를 저장합니다.
  • 모든 데이터는 하나의 마스터 SQL 2005에 저장됩니다. 모든 데이터베이스는 동일한 서버에 있습니다.
  • 각 사용자는
  • 연결 마스터 DB로 된 고유 한 로그인 (회사, 사용자 ID, 비밀번호)를 가지고 파일을 사용하여 DSN없는 연결을 포함
  • IE : (dbConn.Open "드라이버 = {SQL 서버}; 서버 = 11.22.333.444; 데이터베이스 = mywebdb ","myLogin으로 ","mypassword ")

의 필요성 :

자신의 데이터베이스로 회사를 분할 할. 사용자가 로그인하면 회사 이름은 APP에 각 회사에 대해 고유 한 SQL 데이터베이스 연결을 사용하도록 지시합니다.

동적 인클루드 파일은 옵션이 아니므로 어떤 경로를 선택해야합니까?

감사합니다.

+0

[gripe] "로그인"은 동사가 아닌 복수 명사입니다. "사용자가 로그인 할 때 ..."시도하십시오. [/ gripe] – Martha

답변

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 

당신이 하나 개의 탭과 다른 탭에서 다른 회사 한 회사를 열고 자하는 사용자가있는 경우이 문제가 발생할 것이라는 점을 명심하십시오. 그들은 최근에 로그인 한 회사의 정보 만 볼 수있는 이유가 궁금 할 것입니다.

이것이 문제가 될 경우 각 링크의 쿼리 문자열에서 토큰을 전달하고 싶을 것입니다. 이것은 복잡성을 증가 시키지만 (모든 링크를 변경하는 지루한 작업은 제외하고)별로 중요하지 않습니다. 그러면 다음과 같이 표시됩니다.

' 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 

이 설명은 단순화를 위해 토큰이 회사 이름과 같다고 가정합니다. 예를 들어 누군가 "회사 1"에 로그인합니다. 이렇게 성공적으로 수행되면 데이터베이스의 이름 (이 경우 "company1DBName")을 포함하는 "company1 - db"라는 세션 변수가 생성됩니다.

이제 "? companyToken = company1"과 같은 쿼리 문자열이 있어야합니다. 따라서 데이터베이스에 연결하면 해당 토큰을 사용하여 올바른 데이터베이스 이름을 찾습니다. Session (" company1 "+"- db ") ="company1DBName "

아직 해당 회사에 로그인하지 않았거나 (단지 회사 이름을 구성한 경우) 해당 세션 변수가 없으며 로그인 화면으로 가야합니다.

두 회사에서 한 번에 로그인하면 모든 링크에서 데이터베이스 이름을 얻으므로 이제 처리 할 수 ​​있습니다.

의미가 있습니까?

무엇을 하든지 사용자 입력을 사용하여 연결 문자열을 직접 작성하지 마십시오.

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

행운을 빕니다 : 즉, 다음은 잘못된 방법입니다!

+0

기존 페이지에서 연결 문자열을 가져 오는 위치는 어디입니까? – AnthonyWJones

+0

WOW - 빠른 응답! 연결 문자열은 INCLUDE 파일에 저장됩니다. 위의 선택 사례는 내가 가지고 노는 것입니다. 작동하지만 매번 문자열에 회사를 추가해야합니다. 유효한 회사를 확인하기 위해 로그인을 확인한 다음 세션 변수로 저장하여 연결 문자열을 작성 하시겠습니까? –

+0

이것은 또한 실행 가능한 솔루션입니다. 그 대답이 어떻게 끝날지 보여주기 위해 나의 대답을 편집했고, 그런 세션을 사용하는 잠재적 인 함정을 피하는 방법을 보여 주려고했습니다. –

1

연결 문자열은 어디에 저장해야합니까? 포함 시키십시오 .asp 나는 짐작한다.

포함하는 코드를 추가하여 회사 이름 (세션에 저장되어 있습니까?)을 확인하고 그에 따라 연결 문자열을 수정하십시오.

편집 :

문제는 적절한 연결 문자열을 가정 무수한 다른 ASP 페이지에서이 코드를 가질 수있다는 (파일을 포함 db.asp 당신에 선언 된 변수에서 사용할 수를 호출 할 수 있습니다 m_connStr). 이 새로운 요구 사항을 충족 시키려면 이러한 모든 페이지를 수정하지 않아도됩니다.

따라서 db.asp 포함 파일 만 편집하면 m_connStr이 마술처럼 올바른 DB를 가리 키도록하려는 것입니다.

일단 회사가 세션 변수에서 데이터베이스 이름을 설정했다는 것을 알게되면 로그온 페이지를 보게됩니다. 비 존재하지 않는 데이터베이스 세션 변수는 연결 문자열을 야기

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 

주 - :

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

그래서 우리는 템플릿을 사용합니다 -이 :

기존 코드는 다음과 같은 연결 문자열을 가지고 따라서 정의되지 않으므로 실수로 기본 데이터베이스에 연결할 수 없습니다.

지금까지 모든 ASP 페이지가 염려되는 한 일상적인 업무이지만 연결 문자열은 로그온 한 사용자와 관련된 회사에 따라 세션마다 다릅니다.

+0

훌륭한 의견을 보내 주셔서 감사합니다. AWJ 코드 템플릿이 이상적으로 작동해야합니다. 기존 db_include 파일에 통합됩니다. 몇 줄의 코드를 변경하면 전체 앱이 각 회사 DB로 이동합니다. –