分散パーティション ビューのメタデータ表示のトラブルシューティング

権限レベルの低いユーザーが分散パーティション ビューを使用してデータを挿入、更新、または削除しようとすると、SQL Server によって次のエラーが生成されます。

エラー 4436 "UNION ALL ビュー '%.*ls' は更新可能ではありません。パーティション分割列が見つかりませんでした。"

これは、基となるすべてのテーブルが SQL Server の同じインスタンスに存在している場合など、ローカル パーティション ビューには影響しません。

背景

分散クエリでは、SQL Server が、リモート サーバー (リンク サーバー) のテーブルに対する CHECK 制約の SQL 定義を読み取ることができる必要があります。つまり、分散クエリの呼び出し元は、リモート テーブルに対する CONTROL、ALTER、TAKE OWNERSHIP、VIEW DEFINITION のいずれかの権限を持っている必要があります。分散クエリの呼び出し元がこれらの権限のどれも持っていないと、クエリはエラー 4436 で失敗します。

注意

ユーザーがこれらの権限のどれも持っていない場合、ユーザーがカタログにクエリを実行したときに、sys.check_constraintsdefinition 列の値が 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 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