1. ホーム
  2. データベース
  3. mssql2008

SQLServer2008 新規インスタンスのリモートデータベース連携問題(sp_addlinkedserver)

2022-01-20 13:46:12

まず、原因から説明します。

テスト生は自分のコンピュータで異なるバックエンドをテストしていますが、データベースは同じ名前を使用しています。

そこで、SQL Serverの新しいインスタンスを作成し、新しいインスタンスでは起動に別のポートを指定する必要があり、ポートを変更してsp_addlinkedserver文を実行したところ、接続テストに失敗した。

実行されたSQL文は以下の通りです。

EXEC master.dbo.sp_addlinkedserver @server = N'UserDBLink', @srvproduct=N'UserDBLink', @provider=N'SQLNCLI', @datasrc=N'(LOCAL)', @catalog =N'UsersDB'
 /* For security reasons the linked server remote logins password is changed with ######## */
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'UserDBLink',@useself=N'True',@locallogin=NULL,@rmtuser=NULL,@rmtpassword=NULL

まず、問題の解決方法ですが、@datasrcの文字列に以下のようにポート番号を追加する必要があります。

@datasrc=N'(LOCAL)' is modified to @datasrc=N'(LOCAL),port number'

かなり単純でしょう?でも、でも、でも、調べるのに時間がかかったけど、やっとプログラムでの連結文字列の使い方がわかって解決したんだ。
プログラム中のリンク文字列は次のようになります。

Provider=SQLOLEDB.1;Password=11;Persist Security Info=True;User ID=sa;Initial Catalog=db;Data Source=127.0.0.1,1433;

問題を見つける過程で、MSDNのドキュメントをチェックし、実際に新しいポートを書いていない、どうりで長い間、姉妹が投げた 私はMSDNについて間違っているのかどうかわからない!私は、この問題を解決することができます。

以下はそのリンクです。 https://msdn.microsoft.com/zh-cn/library/ms190479.aspx

これは、私がコピーしたMSDNの説明です。

sp_addlinkedserver [ @server= ] 'server' [ , [ @srvproduct= ] 'product_name' ]  
   [ , [ @provider= ] 'provider_name' ] 
   [ , [ @datasrc= ] 'data_source' ]  
   [ , [ @location= ] 'location' ]  
   [ , [ @provstr= ] 'provider_string' ]  
   [ , [ @catalog= ] 'catalog' ]

パラメータです。

[ @server= ] 'server'

作成するリンクサーバーの名前です。サーバーのデータ型はsysnameで、デフォルト値はありません。 

[ @srvproduct= ] 'product_name'

リンク先サーバーのOLE DBデータソースとして追加する製品名です。ライブラリはnvarchar(128)で、デフォルト値はNULLです。SQL Serverの場合、provider_name, data_source, location, provider_string, directoryは指定する必要はない。

[ @provider= ] 'provider_name'

このデータソースに対応するOLE DBアクセス・インターフェースの一意のプログラミング識別子(PROGID)。provider_nameはnvarchar(128)で、デフォルトはNULLです。ただしprovider_nameを省略した場合はSQLNCLIが使用されます。(SQLNCLIを使用すると、SQL ServerはSQL Server Native Client OLE DB Access Interfaceの最新バージョンにリダイレクトします(version.)) OLE DB Access Interfaceは、指定されたPROGIDでレジストリに登録される必要があります。 

[ @datasrc= ] 'data_source'

OLE DBアクセスインターフェイスが解釈するデータソース名です。data_sourceはnvarchar(4000)です。data_sourceは、初期化するOLE DBアクセスインターフェイスのDBPROP_INIT_DATASOURCE属性として渡されます。

[ @location= ] 'location'

OLE DB Access Interfaceで解釈されるデータベースの場所です。ロケーションは nvarchar (4000) で、デフォルト値は NULL です。ロケーションは、初期化するOLE DBアクセスインターフェイスのDBPROP_INIT_LOCATION属性として渡されます。 

[ @provstr= ] 'provider_string'

OLE DB アクセスインターフェース固有の接続文字列で、一意のデータソースを識別します。provider_string は nvarchar (4000) で、デフォルトは NULL です。 provstr は IDataInitialize に渡されるか、 DBPROP_INIT_PROVIDERSTRING プロパティに設定されて OLE DB アクセスインターフェイスが初期化されます。
SQL ServerNative クライアント OLE DB プロバイダでリンクされたサーバを作成するには、server SERVER キーワードを使用してインスタンス =servernameinstancename を指定し、SQL Server の特定のインスタンスを指定します。servername は SQL Server が実行されているコンピュータ名、instancename は SQL Server ユーザーが接続する特定のインスタンスの名 前です。 

[ @catalog= ] 'catalog'

OLE DBアクセス・インターフェースへの接続を確立する際に使用するカタログです。ディレクトリは sysname であり、デフォルトは NULL です。このディレクトリは初期化するOLE DBアクセスインターフェイスのDBPROP_INIT_CATALOG属性として渡されます。SQL Serverインスタンスに対してリンク・サーバーを定義する場合、このディレクトリはリンク・サーバーがマッピングされるデフォルト・データベースを指します。

上記は、SQLServer2008のリモートデータベースのリンクの問題(sp_addlinkedserver)の新しい例です、私はそれがあなたの助けになることを願って、あなたは私にメッセージを与えるために歓迎する任意の質問がある場合、私は速やかにあなたに返信されます