Sql-Server

OPENQUERY 和伺服器權限

  • April 10, 2016

當我執行我的儲存過程時,它是完全成功的,即使我通過 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'

有趣的是,我有這兩個伺服器(通過 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

基本上我的數據在一個臨時表中,它實際上可能是一個表變數。

如果我沒有操作:

   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。

引用自:https://dba.stackexchange.com/questions/104429