1

私は SQL Server 2008 R2 と MS Access 2010 を使用しています。リンク テーブルを含む .accdb があり、リモート ユーザーが複数いるため、Windows 認証の代わりにログインとパスワードを使用しています。SSMS または Access .adp プロジェクトを使用して、このログインとパスワードを問題なく使用できます。

Doug Steele のサイトhttp://www.accessmvp.com/djsteele/DSNLessLinks.htmlのコードを使用してテーブルの DSN レス接続を正常に作成しましたが 、MS Office ブログhttp: //blogs.office.com/2011/04/08/power-tip-improve-the-security-of-database-connections/ .

次のエラーが引き続き発生します。

Connection Failed: SQLState ;28000', Server Error 18452, 
The login is from an untrusted domain and cannot 
be used with Windows authentication.

これは、コードがテスト クエリを SQL に渡そうとする時点です。

Set rst = dbCurrent.OpenRecordset(strTable, dbOpenSnapshot)

そして、[OK] をクリックすると、SQL Server ログイン画面が表示されUse trusted connectionます (これは望ましくありません) がチェックされ、コードで指定した ID ではないログイン ID が自動入力されます。

まず、Access/SQL が Windows 認証を使用して接続を試みたくないのに、継続的に接続しようとするのはなぜですか。NOT to を指定する方法はありますか? Trusted_Connection = NO動作しないようです。

第 2 に (それほど重要ではありませんが、好奇心旺盛です)、ログイン ID は自動入力されますが、私のコードではログイン用に持っているものではありません。SQL Server が別のログイン ID を取得するのはなぜですか?

注:Use trusted connection正しいログインとパスワードのチェックを外して入力すると (VBA コードは正しく受け取っています - 接続文字列をチェックするために使用 してチェックしdebug.printました)、キャッシュされた接続が機能します。したがって、接続文字列がコード内で正しいこともわかっています。

再確認したところ、ログインとパスワードを許可するために SQL Server が「混合モード」に設定されています。(MS SQL Server (2008 R2) Access 2010 でのエラー 18452 による)

「Native Client」がインストールされています (投稿「Microsoft Access 2010 で SQL Server 2008 へのセットアップと ADODB 接続を行う方法」に従って)

私のコード:

Dim dbCurrent As DAO.Database
Dim qdf As DAO.QueryDef
Dim rst As DAO.Recordset
Dim strConnection As String

Dim strTable As String

strTable = "one of my linked tables"

strConnection = "ODBC;DRIVER={sql Server};" & _
                "DATABASE=MyDatabase;" & _
                "SERVER=MyServer;"

Set dbCurrent = DBEngine.Workspaces(0).Databases(0)
Set qdf = dbCurrent.CreateQueryDef("")

With qdf
    .Connect = strConnection & _
               "UID=" & strUserName & ";" & _
               "PWD=" & strPassword
    .SQL = "Select Current_User ();"

    Set rst = dbCurrent.OpenRecordset(strTable, dbOpenSnapshot)

End Wit
InitConnect = True
4

1 に答える 1

1

いくつかのこと:

まず、作成した SQL ログオンが機能することを確認します。SQL ログオンと、特定のデータベース用に作成された SQL ユーザーの両方が必要であることに注意してください (したがって、SQL サーバー ログオンと SQL サーバー ユーザーのログオンの違いを混同しないでください。これは一般的な混乱です)。

SQL Studio ツールを使用して、認証済みユーザーを介してデータベースから切断し、新しい SQL ログオンを介して再接続します。つまり、そのような SQL ログオンが SSMS から機能することを 100% 確認してください。次に (そのときだけ)、Access からの接続を試みます。したがって、SSMS テスト + SQL ログオン + パスワードを試して、それが機能し、テーブルを開いたり使用したりできることを確認してください。SQL ログオンをデータベースの「所有者」にすることを検討してから、そのテーブルに同じ名前のユーザーを作成します。

もちろん、SQL サーバーを混合モードに設定していると思いますか? また、ユーザーがドメインにログインしていない場合、サーバー名の解決に問題が発生する可能性があります。(\192.0.0.50\sqlExpress または SQL の IP アドレスとインスタンス名を使用してみてください)。

次は:

「テスト」ログオン構文は正しくなく、常に false を返します。SSMA を介して SQL サーバーに選択文字列を入力してみて、それがどのように機能しないかを確認してください (その選択は機能しません)。

スペースと () を削除します。

私はただ使用します:

.SQL = "Select Current_User;"

したがって、スペース + () は機能せず、削除する必要があります。

また、Network-DBMSSOCN を含めることをお勧めします。これは、TCP/IP 経由で接続することを意味します。あなたはそうかもしれませんが、これは問題を強制します。

例えば:

  dbCon = "ODBC;DRIVER="SQL Server;" & _
       "SERVER=" & ServerName & ";" & _
       "DATABASE=" & DataBaseName & ";" & _
       "UID=" & USERid & ";" & _
       "PWD=" & USERpw & ";" & _
       "Network=DBMSSOCN"

SSMS で Windows 認証が機能するのではなく、SQL ログオン経由で接続できることを確認したら、ログオンの「select」コマンドを修正します。

また、パスワード キャッシュが「一般的な」ルールとして機能するためには、使用するテスト ログオン文字列が、リンクされた文字列 + uid/パスワードと同じでなければならないことに注意してください。したがって、tabledef リンク文字列には uid/password がありません。

したがって、保存されたテーブル リンクに "APP" などのようなものが含まれている場合、または接続文字列にその他の不要な部分がある場合、TEST ログオン接続文字列には、追加の uid/logon と共にそれらの追加の値が含まれている必要があります。そのため、テスト ログオンとテスト接続文字列が既存の保存済みリンクとはかなり「異なる」場合、キャッシュで適切なテーブルとサーバーの照合に問題が発生する可能性があります。

テストログオンに使用するコードは次のとおりです。

Function TestLogin(strcon As String) As Boolean

  On Error GoTo TestError

  Dim dbs          As DAO.Database
  Dim qdf          As DAO.QueryDef

  Set dbs = CurrentDb()
  Set qdf = dbs.CreateQueryDef("")

   qdf.Connect = strcon

   qdf.ReturnsRecords = False

   'Any VALID SQL statement that runs on server will work below.
    qdf.SQL = "Select Current_User;"
   qdf.Execute

   TestLogin = True

   Exit Function

 TestError:
   TestLogin = False
   Exit Function

End Function

文字列を作成するコードは次のとおりです。

Public Function dbCon(ServerName As String, _
                     DataBaseName As String, _
                     USERid As String, _
                     USERpw As String, _
                     Optional APP As String = "Office 2010", _
                     Optional WSID As String = "SC", _
                     Optional IntegratedSecurity As Boolean = False) As String

      ' returns a SQL server conneciton string
  If IntegratedSecurity = False Then
     dbCon = "ODBC;DRIVER={" & SQLDRIVER & "};" & _
             "SERVER=" & ServerName & ";" & _
             "DATABASE=" & DataBaseName & ";" & _
             "UID=" & USERid & ";" & _
             "PWD=" & USERpw & ";" & _
             "Network=DBMSSOCN"

  Else
     dbCon = "ODBC;DRIVER=" & SQLDRIVER & ";" & _
             "SERVER=" & ServerName & ";" & _
             "DATABASE=" & DataBaseName & ";" & _
             "APP=" & APP & ";" & _
             "WSID=" & WSID & ";" & _
             "Network=DBMSSOCN" & ";" & _
             "Integrated Security= SSPI"
  End If


End Function

そして、私のログオン「テスト」は次のとおりです。

Public Sub Logon()

  ' this simply tests + logs in the user to the default database.
  ' once this occurs, then a odbc logon prompt for each linked table
  ' should not occur - this works WHEN the connection string used here
  ' matches the odbc connection string exaclty.

    Dim strcon     As String


   ' con string settings are:

   ' server , DataBaseName, User, Password, [Optional Application name], [Optional work station]
   ' last two optional are for sql performance tracing etc. - not required

   strcon = dbCon("albertkallal-pc\SQLEXPRESS", "MyTestDec222", "test", "test")

   Debug.Print TestLogin(strcon)


End Sub

Accessフォームなどを起動せずに上記のルーチンを実行/テストします。したがって、上記のコードをテスト/使用するだけです。ログオンを機能させる必要があり、ログオンが機能すると、プロンプトが消えます。

于 2014-09-23T01:36:17.227 に答える