如何使用與 Access 專案] 和 [SQL Server 2000 桌面版的應用程式角色

文章翻譯 文章翻譯
文章編號: 308312 - 檢視此文章適用的產品。
進階: 須具備專家編碼、 互通性,與多使用者技能。

本文只適用於 Microsoft Access 專案 (.adp)。

本文章的有 Microsoft Access 2000] 版本請參閱 318816
全部展開 | 全部摺疊

結論

本文件說明功能、 限制以及在 Microsoft Access 專案 (ADP) 中使用 Microsoft SQL Server 應用程式角色的因應措施。

其他相關資訊

在 SQL Server 中,您可以建立的資料庫中的使用權限更容易管理的資料庫角色。而非分別將個別權限授予每個使用者,您可以進行相同的一般資料庫角色的成員,然後將使用權限指派給資料庫角色本身群組具有相同的權限需求的使用者。除非特定的使用權限明顯拒絕其他地方,成員的使用者會取得授與該資料庫角色的權限。

雖然一般資料庫角色是非常有用的情況下要讓使用者能夠執行自己的臨機操作查詢或更新資料庫,一律是不適當。有時候,您可能希望使用者只時它們使用特定應用程式,而且不要能夠檢視或修改應用程式之外的資料有某種權限。

通常用於解決這個工作的一個方法是只提供一個 SQL Server 使用者帳戶所需的權限。實際的使用者可能具有權限連線到一個資料庫,但不是檢視或修改任何資料。使用者連線到使用個別的使用者帳戶資料庫之後 [ADP 可能再以程式設計方式使用再次連線沒有權限,使用者帳戶的認證。雖然這可能是有效,它不允許您分辨資料庫中的使用者,或決定哪個使用者執行特定動作。

應用程式角色,被為了解決這種限制。與一般資料庫角色不同的應用程式角色沒有成員本身。而是,使用者登入 SQL Server,並連接到資料庫,使用他們自己的認證。在該點的應用程式角色的安全性內容可以套用以程式設計的方式為現有的連線使用 sp_setapprole 預存程序。在 SQL Server 個別使用者仍以區分,但內特定的連接可供使用的權限受限於應用程式角色的權限。使用者的個別權限、 是否較低或更大,不再視為。

建立應用程式角色

Microsoft Access 專案沒有任何視覺化設計工具來建立 SQL Server 安全性物件例如應用程式角色。 Microsoft 建議您使用用戶端工具來建立應用程式角色及指派權限亦包含 SQL Server 或 Microsoft Office XP 程式開發人員的一般版本。但是,您可以仍然建立應用程式角色並授與必要的權限以程式設計方式使用 Transact-SQL (T-SQL) 從一個 ADP。雖然 SQL Server 安全性的完整討論是本文章額外的範圍之外資訊可以在 SQL Server 線上叢書 》 中找到下列的步驟會告訴您如何以程式設計方式建立應用程式角色,並授與新的角色 選取 權限] 資料表上:
  1. 啟動 Access。
  2. 開啟北風範例 Access 專案。
  3. 在 [資料庫] 視窗中按一下 [物件,] 下的 [模組],然後按一下 [新增],以在 Visual Basic 環境中開啟新的模組。

    附註在 Access 2007 中按一下 [在 [建立] 索引標籤上 其他 群組中的 [模組]。
  4. 輸入或貼上下列程式碼貼入新模組:
    Public Function AddNewAppRole(RoleName As String, PW As String) As Boolean
    On Error GoTo EH:
    If CurrentProject.IsConnected Then
    Dim sTSQL As String
        'Create the command
    sTSQL = "EXEC sp_addapprole '" & RoleName & "','" & PW & "'"
        'Send the command
    Application.CurrentProject.Connection.Execute sTSQL
    AddNewAppRole = True
    Else
    AddNewAppRole = False
    End If
    Exit Function
    EH:
    MsgBox Err.Number & ": " & Err.Description, vbCritical
    AddNewAppRole = False
    End Function
    					
  5. 儲存模組,然後結束 Visual 基本的環境。
  6. 建立 [客戶] 資料表的複本,然後將它儲存成 tNewTable。 要這麼做,請您執行下列步驟:
    1. 在 [資料庫] 視窗 客戶] 資料表上按一下滑鼠右鍵,然後按一下快顯功能表上的 [另存新檔]。

      附註在 Access 2007 中請按一下 [瀏覽窗格中的 [客戶] 資料表],按一下 [Microsoft Office 按鈕]、 指向 [另存新檔,然後再按一下 [另 存物件]。
    2. 另存 新檔] 對話方塊在 [儲存資料表 '客戶' 至] 方塊中,輸入 tNewTable],然後再按一下 [確定]。
  7. 在 [資料庫] 視窗中按一下 [物件] 下的 [表單],按一下 [新增],然後再按一下 [在 [設計] 檢視中開啟新表單的 [確定]

    附註在 Access 2007 中按一下 [在 [建立] 索引標籤上 表單 群組中的 [表單設計]。
  8. 新增指令按鈕至新的表單。
  9. 將新的指令按鈕的 OnClick 屬性設定為下列的事件程序:
    On Error GoTo EH:
    'Code only works if ADP is connected.
    If CurrentProject.IsConnected Then
        Dim bNewAppRole As Boolean, strTSQL As String
        Dim strRoleName As String, strPW As String
        strRoleName = "AppRoleName"
        strPW = "Password"
        'Call function to create app role.
        bNewAppRole = AddNewAppRole(strRoleName, strPW)
        'Test to see if it failed.
        If bNewAppRole = False Then
            Exit Sub
        End If
        MsgBox "New Application role '" & strRoleName & "' created", vbInformation
        'Create command to grant permissions.
        strTSQL = "Grant Select on tNewTable to " & strRoleName
        'Send the command.
        Application.CurrentProject.Connection.Execute strTSQL
        MsgBox "Select permissions granted on tNewTable for " & strRoleName
    Else
    MsgBox "ADP must be connected to SQL Server"
    End If
    Exit Sub
    EH:
    MsgBox Err.Number & ": " & Err.Description, vbCritical
    					
  10. 關閉 [Visual Basic 環境,回到表單]。
  11. 儲存此表單,然後再切換表單的 表單] 檢視
  12. 按一下指令按鈕,以執行基礎程式碼。

    請注意您會收到兩個訊息方塊,以表示成功。您收到一建立應用程式角色,並授與第二個之後 tNewTable 到新的角色權限之後。

實作應用程式角色

複雜的主要因素您在 Access 專案中使用應用程式角色時在於 Access 會使用三個連線到 SQL Server,在處理各種工作。在理想的情況下,將應用程式角色套用至整個專案,您必須在所有三個連線的內容中執行 sp_setapprole。每個連線所處理的物件如下所示:

  1. 用來判斷哪些物件會出現在 [資料庫] 視窗以及與其他資料庫系統管理工作。

    用於開啟資料表、 檢視、 預存程序、 函式和記錄來源為表單和子報表 (但不是適用於主報表本身)。

    用於取得下拉式方塊、 清單方塊和報表的記錄來源。
  2. 用於開啟資料表、 檢視、 預存程序、 函式和記錄來源為表單和子報表 (但不是適用於主報表本身)。

    用於取得下拉式方塊、 清單方塊和報表的記錄來源。
  3. 用於取得下拉式方塊、 清單方塊和報表的記錄來源。

雖然可相當輕鬆地存取連線 # 2 和 # 3,沒有方法可供連線 # 1 的內容中執行預存程序。幸運的是,這個連線是最重要的三個,而且很容易地由建構來處理資料庫物件,而不是依賴內建的 [資料庫] 視窗自己使用者介面 (比方說切換表單型別形式) 解決。

下列步驟使用北風範例 Access 專案來示範如何套用應用程式角色對連線 # 2 和 # 3:

  1. 在 [資料庫] 視窗中按一下 [物件] 下的 [表單],按一下 [新增],然後再按一下 [在 [設計] 檢視中開啟新表單的 [確定]

    附註在 Access 2007 中按一下 [在 [建立] 索引標籤上 表單 群組中的 [表單設計]。
  2. 新建立的表單中新增清單方塊,然後將清單方塊的 [名稱] 屬性設至 lst_AppRole
  3. 新增指令按鈕至表單。
  4. 將新的指令按鈕的 OnClick 屬性設定為下列的事件程序:
    On Error GoTo EH
        'This avoids a message that no records were returned.
    DoCmd.SetWarnings False
    Dim TSQL
    TSQL = "EXEC sp_setapprole 'AppRoleName', {Encrypt N 'Password'}, 'odbc'"
        'This sets the app role on Connection #2.
    Application.CurrentProject.Connection.Execute TSQL
        'This sets the app role on Connection #3.
    lst_approle.RowSource = TSQL
    lst_approle.Requery
    DoCmd.SetWarnings True
    MsgBox "The application Role is now in effect.", vbInformation
    Exit Sub
    EH:
    MsgBox Err.Number & ": " & Err.Description, vbCritical
    					
  5. 關閉 [Visual Basic 環境,回到表單]。
  6. 儲存此表單,然後再切換表單的 表單] 檢視
  7. 按一下指令按鈕,以執行基礎程式碼。

    請注意您會收到一個訊息方塊,則表示成功。
  8. 在 [資料庫] 視窗中按一下 [物件,] 下的 [表格],然後再開啟 tNewTable 資料表]。

    附註在 Access 2007 中連按兩下在瀏覽窗格中的 tNewTable 資料表]。
  9. 修改記錄,並嘗試儲存所做的變更。
請注意如想確認您所做的變更您收到關於不具有足夠的權限的錯誤訊息。這是因為您給新的應用程式角色 選取 權限 tNewTable] 資料表上但不是 更新 權限。

根據設計,Access 只在為其使用者至少選取或執行] 使用權限中的 [資料庫] 視窗中顯示物件。 存取會使用連線 # 1,來判斷哪些物件的使用者具有權限的。之後套用應用程式角色,才能連線 # 2 和 # 3 [資料庫] 視窗仍會顯示同一個物件,即使使用者可能不再有所有物件的權限,或者可能並不會顯示出來的多個物件的權限,先前一樣。當您使用 [資料庫] 視窗,這會導致未預期的行為。

例如當您開啟 tNewTable 資料表,"顯然 」 使用者沒有權限編輯和插入資料錄。啟用 [插入新的記錄] 圖示在表格底部,而且使用者能夠一筆資料錄置於編輯模式。您看不到任何視覺線索,否則表示直到您嘗試認可編輯或插入這會產生錯誤訊息。您有權限,當您實際執行時不會認為存取。

最有效的解決方法是為使用者提供一個自訂介面,並不依賴 [資料庫] 視窗。利用切換表單型別使用者介面中,您可以控制完全哪些使用者有存取權的物件。

其他限制和安全性考量

子表單無法運作

與不同的是與其他資料庫] 物件 Access 不會永遠使用相同的連線來擷取子表單的資料來源。Access 通常 (但不是一定) 建立新的連線到 SQL Server 只處理子表單資料錄集,或擷取連結連線到主表單的子表單的欄位資料。因為這個新的連線並沒有套用的應用程式角色,如果您沒有資料庫物件的明確權限,可能會產生權限錯誤。不幸的是,這表示是當套用應用程式角色時,請使用結合子表單沒有可靠的方式。只有有效的解決方法是完全有結合子表單,以程式設計的方式處理的資料操作。當使用在 Access 中的應用程式角色時,這會是最嚴重的限制。

報告無法運作

當您有物件 (例如資料表或檢視名稱列為報表或子報表記錄來源時,Access 會檢查查看物件是否已從 SQL Server 擷取任何資料之前列出在 [資料庫] 視窗中。因為 [資料庫] 視窗使用沒有套用的應用程式角色的連接,如果您沒有基礎資料來源的明確權限,就是會產生錯誤。

若要解決這個問題,一律使用 Transact-SQL 陳述式作為記錄來源為表單和報表。例如使用 「 選取 * 從 ViewName"來代替只是 ViewName"或"Exec StoredProcedureName 」 而非只是 「 StoredProcedureName 」。 這種方式存取將 Transact-SQL 陳述式直接傳遞至 SQL Server,並擷取應用程式角色的權限為基礎的資料。

[公用資料庫角色

應用程式角色取得公用資料庫角色的權限。預設中 NorthwindCS 公用角色都具有大部分物件的完整權限。應用程式角色就通常沒有效果。您在 「 建立應用程式角色 」] 區段中建立 tNewTable 資料表時公用角色已無法取得該資料表的權限,您稍後該資料表上看到應用程式角色安全性內容的效果。不過,其他資料表可能不會顯示應用程式角色下的任何差異因為 Public 角色有那些物件的權限。

VBA 安全性

因為應用程式角色密碼內嵌至應用程式就稱為,知識豐富的使用者能夠從來源] 程式碼讀取應用程式角色名稱和密碼,然後使用該資訊到 SQL Server 存取來自另一個應用程式。因此,最好是 [ADP 編譯到 ADE 檔案,如此一來,就無法檢視原始碼。最小,強制執行 VBA 專案上的密碼。

?考

如需有關本文的 Microsoft Access 2000 版本的詳細資訊,按一下下面的文件編號,檢視 「 Microsoft 知識庫 」 中的發行項:
318816ACC2000: 如何使用應用程式角色與 Access 專案] 和 [SQL Server 2000 桌面引擎 (MSDE 2000)
更多有關 GRANT,請參閱 SQL Server 線上叢書 》 文件。在 SQL Server 線上叢書 》 是可用在下列 Microsoft 網站:
http://www.microsoft.com/sql/techinfo/productdoc/2000/default.asp

屬性

文章編號: 308312 - 上次校閱: 2007年3月29日 - 版次: 6.2
這篇文章中的資訊適用於:
  • Microsoft Office Access 2007
  • Microsoft Office Access 2003
  • Microsoft Access 2002 Standard Edition
關鍵字:?
kbmt kbexpertiseinter kbinfo kbprogramming kbadp kbvba kbhowto KB308312 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:308312
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com