Sql-Server
OPENQUERY 和伺服器權限
當我執行我的儲存過程時,它是完全成功的,即使我通過 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。