2012年9月7日 星期五

SQL Server 處理序資訊無法顯示主機名稱

SQL Server 處理序資訊無法顯示主機名稱

活動監視器說明
http://technet.microsoft.com/zh-tw/library/ms178520%28v=sql.90%29.aspx

說明
=======================================================================
INF: 主機名稱資料行空白的 SPID 小於在 SQL Profiler sp_who 51
http://support.microsoft.com/kb/272696/zh-tw

當您使用 Microsoft SQL Server 2000 Profiler 工具 sp_who,或者您使用 ' SELECT * FROM SYSPROCESSES ' 小於 51 伺服器處理序識別碼 (SPID) 值時,擷取來自伺服器的事件,或顯示目前的連線資訊,主機名稱欄位是空白。主機名稱 是連線到 SQL Server 伺服器用戶端的主機或電腦名稱。如果用戶端應用程式提供主機名稱,則會擴展此資料行。

SQL Server 2000
會保留 SPID 值從 1 50 供內部使用,而 51 或更高的SPID 值代表使用者工作階段。這種行為是預期行為,因為主機名稱會顯示僅供使用者連線。



=======================================================================
SQL管理\主機名稱
http://social.technet.microsoft.com/Forums/zh-HK/sqlservermanagementzhcht/thread/6c345f23-5fd1-4ad4-812b-b97119c3d374

如果 SPID < 51 的話,不顯示主機名稱是正常的
如果是透過應用程式而非 Enterprise Manager 進去的話,當應用程式本身就沒有提供(應該說沒特別設定)主機名稱時,自然就不會顯示出來。可參考此篇 MSDN 文件中,關鍵字 Workstation ID 的說明


SQL Server 2000 沒法從 MAC 位址對應出 IP 位址,可使用 arp -a 的 DOS 指令,如下所示即為一例:

/* 
ALL SPIDS to IP
2005-01-04: Daniel_Janik@yahoo.com, Dallas, Tx
*/

DECLARE @SPID as int,
 @MAXSPID as int,
 @MAC as varchar(12),
 @MACDisplay as varchar(18),
 @IP as varchar(15),
 @CMD as varchar(100)

SET @MAXSPID = (SELECT MAX(SPID) FROM master..sysprocesses)
SET @SPID = (SELECT MIN(SPID) FROM master..sysprocesses where status != 'background' and spid > 7)

CREATE TABLE #temp2 (OUTPUT varchar(255))

WHILE @SPID < @MAXSPID
BEGIN
 -- SPID to MAC
 SELECT @MAC = NET_ADDRESS FROM master..sysprocesses WHERE SPID = @SPID
 
 -- MAC to IP
 CREATE TABLE #temp (OUTPUT varchar(255))
 SET NOCOUNT ON
 INSERT INTO #temp EXEC master..xp_cmdshell 'arp -a'
 
 SELECT @MACDisplay = LEFT(@MAC, 2) + '-' + SUBSTRING(@MAC, 3, 2) + '-' + SUBSTRING(@MAC, 5, 2) + '-' + SUBSTRING(@MAC, 7, 2) + '-' + SUBSTRING(@MAC, 9, 2) + '-' + SUBSTRING(@MAC, 11, 2)
 SELECT @IP = SUBSTRING(output, 3, 15) FROM #temp WHERE output LIKE '%' + @MACDisplay + '%'
 
 -- Resolve the IP
 SET @CMD = 'master..xp_cmdshell "ping -a ' + @IP + '"'
 INSERT INTO #temp2 EXEC (@CMD)

 DROP TABLE #temp
 SET @SPID = (SELECT MIN(SPID) FROM master..sysprocesses where status != 'background' and spid > @SPID)
END

delete from #temp2 where output not like 'pinging%'
delete from #temp2 where output is null
select distinct * from #temp2
DROP TABLE #temp2

沒有留言:

張貼留言