ローカルSQL Server 2008R2があります。リンクサーバーをリモートデータベースに構成しました。
sysadmin
サーバーロールを持つSQLログインアカウントを使用してローカルサーバーにログインすると、リンクサーバーはうまく機能します。リモートサーバーに対してクエリを実行できるため、リンクサーバーの設定が正しいことがわかります。ただし、sysadmin
サーバーロールを持たないアカウントを使用すると、以下のエラーが発生します。
Msg 7416, Level 16, State 2, Line 2
Access to the remote server is denied because no login-mapping exists.
ローカルサーバーとリモートサーバーの両方で、SQLログインが使用されます(Windows認証は使用されません)
リンクサーバーを使用するには、通常のSQLログインアカウントにどのようなセキュリティを構成する必要がありますか?
このブログ によると、User ID
sysadmin以外のアカウントが使用されている場合、プロバイダー文字列内。以下に例を示します。
EXEC master.dbo.sp_addlinkedserver
@server = N'MyLinkServerName',
@provider = N'SQLNCLI',
@srvproduct = 'SQLNCLI',
@provstr = N'SERVER=MyServerName\MyInstanceName;User ID=myUser'
これは私が遭遇したものと正確に一致し、問題を解決します。
更新:代替ソリューションについては、@ Antonおよび@Wouterの回答を参照してください。
代替ソリューションとして、@ provstrの代わりにパラメーター@datasrcを使用できます。 @dataSrcは、ユーザーIDを設定せずに機能します
サンプル:
EXEC master.dbo.sp_addlinkedserver @server = N'LinkServerName', @provider=N'SQLNCLI',@srvproduct = 'MS SQL Server', @datasrc=N'serverName\InstanceName'
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname = N'LinkServerName', @locallogin = NULL , @useself = N'False', @rmtuser = N'myUser', @rmtpassword = N'*****'
コメントも追加しました here も表示されません(理由はわかりません)。
これをいじってみたところ、User ID
プロパティを使用して、@datasrc
の代わりに @provstr
。これは非常に不十分に文書化されていますが、以下の例は私のために機能します:
EXEC master.dbo.sp_addlinkedserver
@server = 'SOME_NAME',
@srvproduct='', -- needs to be explicitly empty, default is NULL and is not allowed
@datasrc='some_server.com\SOME_INSTANCE',
@provider='SQLNCLI';
-- Set up the Linked server to pass along login credentials
EXEC master.dbo.sp_addlinkedsrvlogin
@rmtsrvname='SOME_NAME',
@useself='true', -- Optional. This is the default
@locallogin=NULL; -- Optional. This is the default
この方法を使用すると、すべてのユーザーに対して同じリンクサーバーを再利用できます。現在受け入れられている答えには、ユーザーごとに個別のリンクサーバーをセットアップする必要があるという大きな欠点があります。