ストアード・プロシージャーを実行すると、execを介して実行しても、完全に成功します。
これらを実行する:
sp_GetServerLogins
GO
exec ( 'sp_GetServerLogins ')
GO
私はこれを手に入れます:
言うまでもなく、これは最初に言う:
select @@servername
EXEC sp_serveroption @server = @@servername
,@optname = 'data access'
,@optvalue = 'TRUE'
OPENQUERYを使用して同じサーバーで同じストアドプロシージャを実行すると、次のようになります。
declare @sql nvarchar(max)
select @sql = 'SELECT * FROM OPENQUERY(' + quotename(@@servername) +
',' + '''' + 'SET FMTONLY OFF; exec sp_GetServerLogins ' + '''' + ')'
exec ( @sql)
見つからない場合、違いはLogin_Fromにあります。
基本的に私がここで達成しようとしていることは、同じサーバーに存在するwindows_groupログインに属するwindows_loginsを見つけることです。
私の手順の中で、個々のログインのWindowsグループを取得する重要な行は次のとおりです。
INSERT INTO @UserList EXEC xp_logininfo @LOGIN, 'members'
面白いことに、これらの2つ(execを介してプロシージャを実行し、OPENQUERYを介してプロシージャを実行)がまったく同じものを返すサーバーがあります。すばらしい。
ただし、他の一部のサーバーでは、上記の結果が得られます。
何が欠けている?何か案は?
乾杯マルチェロ
追伸.
以下のコードでこのようなことを実現したいので、OPENQUERYを使用する必要があります。
drop table #radhe
CREATE TABLE #Radhe(
[n] [bigint] NULL,
[Login_Name] [nvarchar](128) NULL,
[Login_From] [nvarchar](128) NULL,
[Account_Type] [nvarchar](128) NULL
)
declare @sql nvarchar(max)
select @sql = 'SELECT * FROM OPENQUERY(' + quotename(@@servername) + ',' + '''' + 'SET FMTONLY OFF; exec sp_GetServerLogins ' + '''' + ')'
INSERT INTO #Radhe
exec ( @sql)
SELECT * FROM #Radhe
基本的に、一時テーブル内にデータがありますが、実際にはテーブル変数である可能性があります。
OPEQUERYを使用しない場合:
drop table #radhe
CREATE TABLE #Radhe(
[n] [bigint] NULL,
[Login_Name] [nvarchar](128) NULL,
[Login_From] [nvarchar](128) NULL,
[Account_Type] [nvarchar](128) NULL
)
INSERT INTO #Radhe
exec sp_GetServerLogins
以下のエラーが発生します:
メッセージ3930、レベル16、状態1、行11現在のトランザクションはコミットできず、ログファイルに書き込む操作をサポートできません。トランザクションをロールバックします。
関数fn_my_permissionsを使用すると、OPENQUERYの内外で正確な権限が取得されます。
declare @sql nvarchar(max)
select @sql = 'SELECT * FROM OPENQUERY(' +
quotename(@@servername) + ',' + '''' + 'SET FMTONLY OFF; SELECT * FROM
fn_my_permissions(NULL, ''''SERVER''''); ' + '''' + ')'
exec ( @sql)
あなたはアイデアを求めました-これは私のものです。
同様の問題がありました。問題が発生しているSQL Serverで、SQL ServerサービスアカウントをビルトインアカウントではなくWindowsアカウントに変更し、SQL Serverを再起動して、クエリを再試行してください。
SQLエージェントでこれらのクエリを実行している場合は、SQLエージェントアカウントを実際のWindowsアカウントに変更する必要がある場合があります。
私の考えでは、ビルトインアカウントはActive Directoryに適切にアクセスできません。