分布式分区视图元数据可见性故障排除
如果低特权用户尝试通过分布式分区视图插入、更新或删除数据,则 SQL Server 将生成以下错误:
错误 4436:“UNION ALL 视图 '%.*ls' 不可更新,因为没有找到分区依据列。”
此问题不会影响本地分区视图,例如,当所有基础表都在同一 SQL Server 实例上时。
后台
对于分布式查询,SQL Server 必须能够读取远程(链接)服务器表的 CHECK 约束的 SQL 定义。这意味着分布式查询的调用方必须对远程表具有 CONTROL、ALTER、TAKE OWNERSHIP 或 VIEW DEFINITION 权限。如果分布式查询的调用方不具备这些权限之一,则查询将失败,并生成错误 4436。
注意 |
---|
如果用户不具备这些权限之一,则在用户查询目录时,sys.check_constraints 中的 definition 列的值将为 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