web-dev-qa-db-ja.com

MSSQLリンクサーバー上のすべてのカタログを表示できない

SqlServer 2000では、SqlServer 2005マシンへのリンクサーバーを作成し、「サーバータイプ」を「SQLサーバー」(最初のラジオボタン)に設定し、リンクサーバー名をリモートマシンのホスト名に設定しました。

ただし、SqlServer 2000は、2005サーバー上にある多くのカタログのうち1つしか表示できません。その1つのカタログのテーブルから問題なく選択できますが、同じ2005サーバー上の他のカタログにはアクセスできません。

これがなぜ起こっているのかを理解するために私が探すことができる設定にはどのようなものがありますか、またはリンクサーバーでSqlServer 2000が参照できるカタログの数に制限はありますか?

alt text

5
Chris Wenham

リンクサーバーのセキュリティ設定を編集して、リンクサーバー経由でアクセスするすべてのカタログへのアクセス許可を持つSQL 2005インスタンスへのログインを指定する必要があります。正確な手順を説明するためのSQL 2000サーバーはもうありませんが、これは SQL 2000リンクサーバーのセキュリティを確立する方法

編集:
リンクされたサーバーが現在ログインしている資格情報を使用できるようにするには、SQL Server Centralでこの記事の Kerberos認証の構成 を参照してください。ターゲットサーバーに対して認証するためのユーザー。 SQL Serverの信頼の委任の設定 に関する私の質問への回答も参照してください。

4
squillman

Kerberosを途中まで設定しているため、この問題が発生しています。ダブルホップの問題が発生しています。過去数日の間に、リンクサーバーのセットアップについていくつかのことを学びました。 「 SQL Server 2008でKerberosの制約付き委任を実装する方法 」に関するこのドキュメントは、私に最も役立ちました。

リンクサーバーでの統合セキュリティの使用に関する重要なポイントは次のとおりです(つまり、「ログインの現在のセキュリティコンテキストを使用して作成する」)

  • Windowsアカウントは、ServerAとServerBの両方にアクセスできる必要があります。
  • サーバーはTCP/IPまたは名前付きパイプを使用する必要があります
  • ServerAとServerBの両方に独自のSPNが登録されている必要があります。
    • そうでない場合は、ユーザーANONYMOUSエラーのログインに失敗することがあります。
    • 短い名前を使用する場合は、Active Directoryドメイン名を使用してFQDNに解決する必要があります。短い名前を入力し、それが他のドメイン名に解決されるが、ADドメイン名は壊れているようです。別の方法として、ADドメイン名を指すセカンダリドメインでCNAMEを使用します。
    • SPNを確認するには:setspn -l DOMAIN\SQL_Engine_Svc_Account
    • SPNを設定するには:私は100%ではないこれらのエントリのすべてが必要ですが、これらはクライアントが行う可能性のあるさまざまな方法すべてをカバーするために追加したものですインスタンスに接続します。 警告!これらのSPNは大文字と小文字が区別されます。 SPNを設定した後、インスタンスをリセットする必要があります。エンジンにこれらを自動的に登録させることができますが、私の場合、DNSエイリアスを使用すると、正しく登録されません。
      • 基本構文:setspn -A MSSQLSvc/SQLHOSTNAME [FQDN] [:Port] [:INSTANCE]
      • デフォルトのインスタンス:
        • setspn -A MSSQLSvc/HOSTNAME DOMAIN\SQL_Engine_Svc_Account
        • setspn -A MSSQLSvc/HOSTNAME:1433 DOMAIN\SQL_Engine_Svc_Account
        • setspn -A MSSQLSvc/HOSTNAME.DOMAIN.ORG DOMAIN\SQL_Engine_Svc_Account
        • setspn -A MSSQLSvc/HOSTNAME.DOMAIN.ORG:1433 DOMAIN\SQL_Engine_Svc_Account
      • 名前付きインスタンス:
        • setspn -A MSSQLSvc/HOSTNAME:INSTANCENAME DOMAIN\SQL_Engine_Svc_Account
        • setspn -A MSSQLSvc/HOSTNAME.AD.ORG:INSTANCENAME DOMAIN\SQL_Engine_Svc_Account
      • DNSエイリアスを持つ名前付きインスタンス:(実際のホスト名とは異なるDNSエイリアスを使用します。)
        • setspn -A MSSQLSvc/ALIAS DOMAIN\SQL_Engine_Svc_Account
        • setspn -A MSSQLSvc/ALIAS:1433 DOMAIN\SQL_Engine_Svc_Account
        • setspn -A MSSQLSvc/ALIAS:INSTANCENAME DOMAIN\SQL_Engine_Svc_Account
        • setspn -A MSSQLSvc/ALIAS.DOMAIN.ORG:1433 DOMAIN\SQL_Engine_Svc_Account
        • setspn -A MSSQLSvc/ALIAS.DOMAIN.ORG:1433 DOMAIN\SQL_Engine_Svc_Account
        • setspn -A MSSQLSvc/ALIAS.DOMAIN.ORG:INSTANCENAME DOMAIN\SQL_Engine_Svc_Account
  • SQLエンジンアカウントには、「アカウントは機密情報であり、委任できない」という設定があってはなりません。
  • ダブルホップのリンクサーバー接続を構成するときは、委任を構成する必要があります。
    • Active Directoryのユーザーとコンピューターで、SQLServerAのエンジンサービスのサービスアカウントを見つけます(アカウントを使用している場合-それ以外の場合は、コンピューターアカウントを見つけます)。のみ '追加ボタンをクリックします。 SQLServerBのエンジンサービスのサービスアカウントを見つけます。作成しようとしているリンクサーバーに関連する、以前に構成したSPNを選択します。
2
FuriousD

やった!

すべてのサーバーを相互にリンクするために使用されるリモートログインIDには、データベースへの読み取り/書き込みアクセス権が必要です。

データベースへの読み取りおよび書き込みアクセスを許可するとすぐに、データベースはリンクサーバーの下のカタログのリストに表示されます。

各データベース>セキュリティ>ユーザーに移動し、リモートログインを見つけます。そこにない場合は、サーバーレベル>セキュリティ>ユーザー>ユーザーマッピングに移動し、リンクするデータベースを確認します。ここで、リモートログインに読み取り/書き込み権限があることを確認します。データベース>セキュリティ>ユーザー>所有スキーマに移動して、db_datareaderやdb_datawriterを確認します。

幸運を!

ジャウィド

0
Jawid