![](/img/trans.png)
[英]Null date in MS Access form causes error in SQL Server when table is updated using ADO & 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.