疑難排解分散式資料分割檢視的中繼資料可見性
新增: 2005 年 12 月 5 日
如果低權限使用者嘗試透過分散式資料分割檢視插入、更新或刪除資料,則 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
請參閱
工作
概念
其他資源
CREATE VIEW (Transact-SQL)
GRANT (Transact-SQL)