web-dev-qa-db-ja.com

SQL Serverリンクサーバーとリモート統計

SQL ServerがリモートSQL Server(リンクサーバーなど)の統計をどのように使用するかをよりよく理解しようとしています。ユーザーがリモートボックスの統計を使用できるようにするには、db_owner/db_ddladmin権限が必要であることを理解しています。マイクロソフトからの以下のテキストに基づいて、これは最初は本当に簡単に思えます。

リンクサーバーでテーブルを使用しているときに最適なクエリプランを作成するには、クエリプロセッサにリンクサーバーからのデータ分散統計が必要です。テーブルの列に対する制限付きのアクセス許可を持つユーザーは、すべての有用な統計を取得するための十分なアクセス許可を持っていない可能性があり、クエリプランの効率が低下し、パフォーマンスが低下する可能性があります。リンクサーバーがSQL Serverのインスタンスである場合、利用可能なすべての統計を取得するには、ユーザーはテーブルを所有しているか、リンクサーバー上のsysadmin固定サーバーロール、db_owner固定データベースロール、またはdb_ddladmin固定データベースロールのメンバーである必要があります。 。

私を混乱させているのは、「ユーザー」という言葉です。ユーザーのログインではなく、すべての接続に標準のセキュリティコンテキストを使用します。このログイン/ユーザーは、問題のデータベースに対して上記で定義されている必要な権限を持っています。また、なりすましは使用しません。

削除サーバーで昇格されたアクセス許可のあるアカウントとないアカウントを使用して、クエリを実行し、両端でトレースをキャプチャしようとしました。実際のユーザー(キーボードの男)が上位の権限を持っていない限り、リモートサーバーが統計を収集していないように見えます。ユーザーが必要な権限を持っている場合にのみsys.sp_table_statistics2_rowsetへの呼び出しが表示されるため、これは正しいと私は信じています。

これが理にかなっていることを本当に望みます。

SQL 2008 R2以下でこれが実際にどのように機能するかについて誰かが理解していますか?

5
PseudoToad

私がしているのは、この「トリック」です。

この 'linkuser'に、必要な他のすべてのandddl_admin特権を読み取らせてから、次のスクリプトを実行して、ddl_admin特権を実際に使用できないようにします。

しかし、技術的にはddl_adminのメンバーになることで、ユーザーはリモートデータベースの統計を見ることができます。 (注:SQL2012SP1以降、このハックは必要ありません。統計は表示されているはずですが表示されます)

DENY CREATE TABLE TO [LinkUser]
DENY CREATE VIEW TO [LinkUser]
DENY CREATE PROCEDURE TO [LinkUser]
DENY CREATE FUNCTION TO [LinkUser]
DENY CREATE RULE TO [LinkUser]
DENY CREATE DEFAULT TO [LinkUser]
DENY CREATE TYPE TO [LinkUser]
DENY CREATE Assembly TO [LinkUser]
DENY CREATE XML SCHEMA COLLECTION TO [LinkUser]
DENY CREATE SCHEMA TO [LinkUser]
DENY CREATE SYNONYM TO [LinkUser]
DENY CREATE AGGREGATE TO [LinkUser]
DENY CREATE MESSAGE TYPE TO [LinkUser]
DENY CREATE SERVICE TO [LinkUser]
DENY CREATE CONTRACT TO [LinkUser]
DENY CREATE REMOTE SERVICE BINDING TO [LinkUser]
DENY CREATE ROUTE TO [LinkUser]
DENY CREATE QUEUE TO [LinkUser]
DENY CREATE SYMMETRIC KEY TO [LinkUser]
DENY CREATE ASYMMETRIC KEY TO [LinkUser]
DENY CREATE FULLTEXT CATALOG TO [LinkUser]
DENY CREATE CERTIFICATE TO [LinkUser]
DENY CREATE DATABASE DDL EVENT NOTIFICATION TO [LinkUser]
DENY CHECKPOINT TO [LinkUser]
DENY ALTER ANY SCHEMA TO [LinkUser]
DENY ALTER ANY Assembly TO [LinkUser]
DENY ALTER ANY DATASPACE TO [LinkUser]
DENY ALTER ANY MESSAGE TYPE TO [LinkUser]
DENY ALTER ANY CONTRACT TO [LinkUser]
DENY ALTER ANY SERVICE TO [LinkUser]
DENY ALTER ANY REMOTE SERVICE BINDING TO [LinkUser]
DENY ALTER ANY ROUTE TO [LinkUser]
DENY ALTER ANY FULLTEXT CATALOG TO [LinkUser]
DENY ALTER ANY SYMMETRIC KEY TO [LinkUser]
DENY ALTER ANY ASYMMETRIC KEY TO [LinkUser]
DENY ALTER ANY CERTIFICATE TO [LinkUser]
DENY REFERENCES TO [LinkUser]
DENY ALTER ANY DATABASE DDL TRIGGER TO [LinkUser]
DENY ALTER ANY DATABASE EVENT NOTIFICATION TO [LinkUser]
6
John Alan