分散パーティション ビューのメタデータ表示のトラブルシューティング
権限レベルの低いユーザーが分散パーティション ビューを使用してデータを挿入、更新、または削除しようとすると、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
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