簡體   English   中英

在 SQL 服務器中使用 VBA-ADO 更新視圖需要對基礎表具有 UPDATE 權限(MS Access / VBA)

[英]Updating views with VBA-ADO in SQL Server requires UPDATE privileges on underlying table (MS Access / VBA)

我在 MS Access 中使用 ADO 更新視圖時遇到問題。

我為我的表創建了視圖,它們包含可以更改的列和行。 例如,表tbl_tablename將具有視圖: vw_tablename_editable和一些WHERE子句來確定行是否應該是可編輯的。

CREATE VIEW vw_tablename_editable 
AS 
    SELECT tablename_id, tablename_fieldtoupdate 
    FROM dbo.tbl_tablename 
    WHERE table_criteriafield > 1000 -- 1000 being some criteria

權限有效:當我以僅對視圖具有UPDATE權限的用戶身份對視圖運行UPDATE查詢時,信息已正確更新。 此外,在 Access 中使用 DAO 鏈接表時,我可以查看和修改數據。

問題是當我使用 ADO 並嘗試更新視圖時,使用 VBA 中的綁定控件和手動更新。

Dim rs as ADODB.Recordset
Set rs = New ADODB.Recordset
        
    With rs
        Set .ActiveConnection = connectionstr            
        .source = "SELECT tablename_id, tablename_fieldtoupdate FROM vw_tablename_editable " & _ 
        "WHERE tablename_id = " & id_ofrecordtobeupdated
        .cursortype = adOpenStatic
        .cursorlocation = adUseClient
        .locktype = adLockOptimistic
       .Open
   End With 

rs!tablename_fieldtoupdate = "new value"

rs.update

我收到的錯誤消息是:

object 'tbl_tablename'、數據庫 'mydatabase'、架構 'dbo' 的 UPDATE 權限被拒絕

它似乎與這個問題有關,但是,ADO 中的 SELECT 語句很好,沒有讓用戶訪問基礎表。

當我為用戶提供對表或 DBO 模式的直接 UPDATE 訪問權限時,問題就解決了,但我想避免這種情況。 當以 DBO 身份登錄時,更新可使用 MS Access 綁定控件和手動 VBA 方式。

我也嘗試制作索引視圖,但這似乎也沒有什么不同。

編輯

根據用戶@wqw 插入 WITH VIEW_METADATA 的建議,它現在可以完美運行!

CREATE VIEW vw_tablename_editable 
WITH VIEW_METADATA
AS 
    SELECT tablename_id, tablename_fieldtoupdate 
    FROM dbo.tbl_tablename 
    WHERE table_criteriafield > 1000 -- 1000 being some criteria

您只需要使用 WITH VIEW_METADATA 選項創建您的視圖,該選項通常對任何與 T-SQL 相關的(例如查詢或存儲過程)無害,但指示 OLEDB/ADO(和其他數據訪問連接器,如 ODBC)通過視圖的列而不是更新(幾個)基表。

當對同一用戶擁有的視圖執行任何 DML 時, 所有權鏈將禁止對表進行權限檢查。 顯然 ADO 正在發現底層表並直接訪問它。

要解決此問題,請不要通過記錄集 object 進行更新。 而是構造一個 SQL UPDATE 查詢並直接運行它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM