2017-02-21 6 views
2

ありがとうございました!マルチユーザーアクセスフロントエンドをSQL Serverバックエンドに接続

〜100人のエンドユーザーに配布する予定のAccessデータベースを構築しました。私は現在、5人のユーザーのパイロットプログラムを実行しています。私はテーブルをSQL 2014 Serverに移行しましたが、現在、パイロットプログラムのバックエンドは共有ネットワークフォルダにあります(それらの場所は不明です)。私は、その共有ネットワーク上にファイルを保存し、デスクトップにコピーを保存するようにエンドユーザーに指示することで、アクセスフロントエンド(accdeファイルタイプ)を配布しました。パイロットは少し遅くなくてもうまくいきます。

私が午前問題はこれです:

私は私のマシン上のODBC接続をセットアップすることができるよと、その接続を介してSQL Serverのバックエンドに接続することができています。しかし、私はエンドユーザがサーバ上のテーブルにアクセスする方法を知りません。サーバー上の各ユーザーのユーザー名を作成し、読み取りと書き込みのアクセス権を与える必要がありますか?フロントエンドをインストールする予定の各マシンにODBC接続を作成する必要がありますか?私は、各マシンでODBC接続を作成する必要はありませんが、これを回避することは可能ですか?ありがとうございました!

Accessバージョン:2013 SQL:2014 SSMS 2014

-Charlie

+0

ここではいくつか質問がありますが、まったく簡単なものはありません。アプリケーションのすべてのユーザーに対してデータベースユーザーを作成する必要はありませんが、必要に応じて確実に行うことができます。それは私にとって過度のように聞こえるが、場合によってはそれは意味をなさない。接続の質問については、コード内の接続をどのように作成するかによって異なります。 ODBC接続が必要な場合は、すべてのマシンに1つずつ作成する必要があります。代わりにサーバーに直接接続することをお勧めします。 –

答えて

1

の作業は、あなたはすべてのマシン上のODBC接続は必要ありません。 DoCmd.TransferDatabaseでODBC接続文字列を使用して接続を作成できます。これは永続的なものなので、フロントエンドの開発コピーで接続/更新を実行するだけで、接続は存在し、エンドユーザーのコピーに保持されます。

あなたは認証の問題に対処する必要があります。セキュリティ状況に応じて、単一の「データベースユーザー」を作成し、上記の接続にユーザー名とパスワードを含めることができます。あなたがAD環境にいるなら、それを認証のために使うことができます。または、ユーザーまたはユーザーグループごとに個別のSQLアカウントを作成します。あなたが何をしていても、アクセスがそれらに読書/書込み権限を持っている場合、ユーザーはテーブルを見たり編集したりすることができます。ビューを使用して個々のテーブルを保護し、テーブル自体ではなくアクセスにリンクすることができます。

ユーザーにフロントエンドのローカルコピーを作成させないようにすることをおすすめします。これは、ユーザーがフロントエンドの最新バージョンを使用していることを確認する悪夢になります。代わりに、ショートカットを作成するように奨励してください。ユーザーごとのローカルの一時テーブルや、フォームやレポートを動的に編集するコードがない限り、誰もが同じフロントエンドファイルを使用しないようにする理由はあまりありません。その場合でも、各ユーザーのフロントエンドコピーを作成または上書きする展開バッチファイルを作成します。 SQL Serverデータベースにリンク

サンプルコード:

Public Sub LoadDatabase() 

Dim MyDB As DAO.Database 
Set MyDB = CurrentDb 
Dim d As DAO.Recordset 
Set d = MyDB.OpenRecordset("SELECT TableName FROM tblLinkTables") 
d.MoveFirst 
Do While Not d.EOF 
    DoCmd.DeleteObject acTable, d!TableName 
    DoCmd.TransferDatabase acLink, "ODBC Database", "ODBC;Driver={SQL Server};Server=MYSQLSERVERNAME;Database=MyDatabaseName;Uid=DatabaseUser;Pwd=DatabaseUserPassword", acTable, d!TableName, d!TableName, False, True 
    d.MoveNext 
    Loop 
d.Close 
Set d = Nothing 

End Sub 

リンクへのテーブルのリストが各テーブルをリンクするための単一のフィールドのTableNameでtblLinkTablesと呼ばれるローカルテーブルに存在します。これは非常に単純化されたバージョンです。私が実際に使用しているのは、SQLテーブルとは異なるローカルテーブル名を持ち、ビューをリンクしてプライマリキー(オプション)を作成する機能です。

+0

SunKnight0ありがとう、これは私にある方向を与える。 DoCmd.TransferDatabaseオプションの調査を開始します。これはVBAコードに組み込まれていますか?ユーザーがデータベースを開くとすぐに実行する必要がありますか? – Chuck0185

+0

いいえ。テーブルに接続するために一度だけ実行します。その後、.accdbファイルとそのすべてのコピーにリンクが保持されます。私は単純な 'LoadDatabase'関数を私の答えに追加します。 – SunKnight0

+0

フロントエンドへのショートカットがあれば、フロントエンドが存在する共有ドライブを指しているはずです。共有ドライブが存在するサーバー(および共有ドライブのフロントエンド)で情報の処理が行われるのでしょうか?これは非常に遅いサーバーなので、私の考えは、ユーザーのコンピュータがより高速に動作するということでした。 – Chuck0185

0

以下は、SQL Serverへの接続を取得する方法の一例です。これは、Windowsユーザーがアクセスを許可されている信頼された接続か、sqlserverで定義されたユーザーIDとパスワードを指定することができます。

' The following are some of the parameters the connection will use. 
Global gv_DBS_SQLServer     As ADODB.Connection 
Global gvstr_SQLServer_Name    As String 
Global gv_SQLServer_DSN     As String 
Global gvstr_SQLServer_Database   As String 

'Call the GetConnection Function 
' Pass Name of Server; Database Name; Connection Variable; adUseServer; True if using Password; False if not using a Trusted Connection; 
' Sample 
    If GetConnection(gvstr_SQLServer_Name, gvstr_SQLServer_Database, _ 
      gv_DBS_SQLServer, adUseServer, True, False) = False Then 
     MsgBox "Unable to connect to SQL Server", vbOKOnly, "No Connection" 
    End If 


Public Function GetConnection(ByVal strDSN As String, _ 
     ByVal strDatabase As String, _ 
     ByRef cnLocal As ADODB.Connection, _ 
     ByVal CursorLoc As CursorLocationEnum, _ 
     ByVal UsePassword As Boolean, _ 
     ByVal blnTrusted As Boolean) As Boolean 

Dim strConnectString As String 
Dim strDisplay   As String 

    On Error GoTo ERROR_HANDLER 
    GetConnection = False 
Retry_Connection: 
    If cnLocal Is Nothing Then Set cnLocal = New ADODB.Connection 
    If cnLocal.State = adStateOpen Then 
     Debug.Print "Connection already open -- -will not reopen!!" 
     GetConnection = True 
     GoTo Proc_Exit 
    End If 
    With cnLocal 
     Debug.Print "Use TRUSTED CONNECTION (ABOVE)" 
     If blnTrusted = True Then 
      strConnectString = "Driver={SQL Server};" & _ 
           "Server=" & strDSN & ";" & _ 
           "Database=" & strDatabase & ";" & _ 
           "Trusted_Connection=yes" 
     Else 
      strConnectString = "Driver={SQL Server};" & _ 
           "Server=" & strDSN & ";" & _ 
           "Database=" & strDatabase & ";" & _ 
           "User Id=UUUUUUU;Password=" & DecryptString("PPPPPPPP") & "" 

      strDisplay = "Driver={SQL Server};" & _ 
         "Server=" & strDSN & ";" & _ 
         "Database=" & strDatabase & ";" & _ 
         "User Id=UUUUUU;Password=PPPPPPP" 

     End If 

     Debug.Print "Will use Conn String: " & strDisplay 
     .ConnectionString = strConnectString 
     .CursorLocation = CursorLoc 
     .Open 
    End With 
    GetConnection = True 
Proc_Exit: 
    Exit Function 
ERROR_HANDLER: 
    Debug.Print Err.Number & vbCrLf & Err.Description 
    Err.Source = "Module_Connect: " 
    DocAndShowError 
    Resume Proc_Exit 
    Resume Next 
    Resume 
End Function 
3

いくつかのこと:

リンクテーブルを作成するときは、単にリボンのインポートやリンクを使用 - して、ODBCデータベース。ファイルDSNを選択するだけです。これは、DEFAULTによるアクセスでDSNレス接続を使用するためです。簡単に言えば、これは、テーブルをリンクすると、各ワークステーションにアプリケーションを配布でき、SYSTEM/Machine DSNを設定する必要がないことを意味します。

デフォルトファイルDSNを使用してください.AccessがSQLサーバーへのリンクを作成すると、そのようなリンクはDSNなしであり、各ワークステーションには設定が不要です。

SQLサーバー上でユーザーを作成していますか?さて、各ユーザーに何らかの特別なセキュリティを必要としない限り、必要はありません。 SQLログオンを使用している場合は、上記のリンク処理中にパスワードの保存オプションを "確認"してください。デフォルトでは、リンクされた表はDSNなしであるため、実際にはすべてのユーザーは同じSQLユーザー/パスワードを使用するため、各ユーザーに透過的になります(ログオンする必要はありません)。

SQLログオンでWindows認証を使用している場合、セキュリティはSQL ServerではなくWindowsシステムで設定されます。この場合、各ユーザーのWindowsログオンは、SQLサーバーの使用を制御(許可)するために使用されます。ドメインコントローラを使用していない場合は、SQLログオンを使用していて、おそらく使用しているログオンで十分です。企業の環境でも、IT管理者をSQL Serverへのログオンとアクセス許可ごとに呼びたくないので、SQLログオンを選択します。したがって、IT管理者がSQLサーバーに十分な権限を与えた後、私は自分のログオンを作成することができます。または、誰もが同じログオンを使用するだけで、ITを煩わせる時間を無駄にする必要はありません人々。

いくつか追加の最終点: ADOやVBAコードや接続文字列などをすべて使用することをお勧めしません。これらは必須ではありません。実際にはほとんどの場合、アプリケーションのADOコードを回避する必要があります。また、oleDBはSQLサーバー(ADOが依存する傾向がある)に対して償却されています。

あなたはまだ、各ワークステーションにあるフロントエンドプログラムを配置したいと考えています。あなたはソフトウェアを開発しているので、各ワークステーションまたは会計パッケージに単語をインストールするのと同じように、過去30年間行われたIT業界のように各ワークステーションにソフトウェアをインストールします。あなたは確かに共有フォルダ上のデータを共有することができますが、実際のアプリケーション(単語、Excel、またはこの場合は各ワークステーションにあなたのアプリケーションをインストールします)をインストールしてください。そのようなユーザーへの展開が同じネットワーク上にある場合は、SQLサーバーに「接続」または「リンク」するための特別なコードは必要ありません。開発者またはコンサルタントが「オフサイト」の場合は、いくつかのコードは、あなたのオフサイトで開発しているものとは異なることは間違いありませんが、SQL Serverに再リンクするようにしてください。現場で開発することができない場合、または使用するSQL Serverが実際の実動SQLサーバーの「コピー」または「テスト」バージョンである場合に必要です。

+1

機能を追加/変更できるようにするには、手動ですべてのテーブルを手作業でリンクして更新することができますが、すべてを再リンクする機能が必要です。これにより、テストデータベースを使用できるようになり、開発およびテストは本番データベースでは実行されません。 – SunKnight0

+0

@Albert D. Kallalフロントエンドの配布に関して、私は長年Auto Front End Updaterを使用してきました。これはTony Towesによって作成され、http://autofeupdater.com/で利用可能です。 –