共用方式為


疑難排解分散式資料分割檢視的中繼資料可見性

如果低權限使用者嘗試透過分散式資料分割檢視插入、更新或刪除資料,則 SQL Server 會產生下列錯誤:

錯誤 4436「UNION ALL 檢視 '%.*ls' 不是可更新的,因為找不到資料分割資料行。」

這個問題並不會影響本機資料分割檢視 (例如,所有基礎資料表都存在於相同的 SQL Server 執行個體時)。

背景

若為分散式查詢,則 SQL Server 必須可讀取遠端 (連結) 伺服器之資料表上 CHECK 條件約束的 SQL 定義。這表示分散式查詢的呼叫者必須要有遠端資料表的 CONTROL、ALTER、TAKE OWNERSHIP 或 VIEW DEFINITION 權限。如果分散式查詢的呼叫者沒有其中一個權限,則查詢會因錯誤 4436 而失敗。

[!附註]

如果使用者沒有上述任一權限,則在使用者查詢目錄時,sys.check_constraints 中之定義資料行的值會為 NULL。

若要解決錯誤 4436

若要讓呼叫者看到 CHECK 條件約束的定義,請將每個目標資料表的 VIEW DEFINITION 授與呼叫者,而每個目標資料表的基礎建構在分散式資料分割檢視上。

例如,假設 Server1 和 Server2 是聯盟伺服器,且彼此定義成連結伺服器。假設 master.dbo.t1 是可由所有 dpv_users 資料庫角色成員存取的資料分割資料表。假設 dpv_users 包含所有透過分散式資料分割檢視而擁有 SELECT、INSERT、UPDATE 和 DELETE 存取權的使用者。

在每個連結伺服器上執行下列程式碼。

CREATE TABLE t1(c INT PRIMARY KEY CHECK (...)) ; -- CHECK is different on each server.
GO

GRANT SELECT, INSERT, UPDATE, DELETE, VIEW DEFINITION ON t1 TO dpv_users ;
GO

CREATE VIEW the_dpv AS
    SELECT * FROM Server1.master.dbo.t1
    UNION ALL
    SELECT * FROM Server2.master.dbo.t1 
GO