web-dev-qa-db-ja.com

OPENQUERYとサーバーの権限

ストアード・プロシージャーを実行すると、execを介して実行しても、完全に成功します。

これらを実行する:

    sp_GetServerLogins
    GO
    exec ( 'sp_GetServerLogins ')
    GO

私はこれを手に入れます: enter image description here

言うまでもなく、これは最初に言う:

    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)

enter image description here

見つからない場合、違いは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現在のトランザクションはコミットできず、ログファイルに書き込む操作をサポートできません。トランザクションをロールバックします。

enter image description here

関数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)
3

あなたはアイデアを求めました-これは私のものです。

同様の問題がありました。問題が発生しているSQL Serverで、SQL ServerサービスアカウントをビルトインアカウントではなくWindowsアカウントに変更し、SQL Serverを再起動して、クエリを再試行してください。

SQLエージェントでこれらのクエリを実行している場合は、SQLエージェントアカウントを実際のWindowsアカウントに変更する必要がある場合があります。

私の考えでは、ビルトインアカウントはActive Directoryに適切にアクセスできません。

1
Sting