none
SQL管理\主機名稱 RRS feed

  • 問題

  • 請教各位版上前輩

    近日因為要追查是那位使用者Lock Table,於是進SQL Enterprise Manager去查看處理序資訊

    發現主機名稱欄位是空的,是否我需要安裝何種驅動或程式,才能讓這個主機欄位有資料呢?

     

    主機欄位有資料的,目前看到的都是有安裝MS SQL的主機,要如何才能讓一般使用者登入後

    在主機欄位顯示他的主機名稱呢?

    2011年5月4日 上午 08:50

解答

  • 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
    
    

    樓上提供的那個動態檢視不能在 SQL Server 2000 執行



    ☞ 這裡是「免費的討論區」付費支援服務請造訪 此處享受尊榮服務
    如果回覆對您有幫助,請記得按下標示為解答」
    • 已標示為解答 Wnchn 2011年5月6日 上午 03:34
    2011年5月5日 上午 03:44
    版主

所有回覆

  • Nothing you can do on this, but you can find ip address of the session and get machine name by running 'ping -a ip_address' in dos prompt.
    2011年5月4日 下午 02:30
    • 如果 SPID < 51 的話,不顯示主機名稱是正常的
    • 如果是透過應用程式而非 Enterprise Manager 進去的話,當應用程式本身就沒有提供(應該說沒特別設定)主機名稱時,自然就不會顯示出來。可參考此篇 MSDN 文件中,關鍵字 Workstation ID 的說明


    ☞ 這裡是「免費的討論區」付費支援服務請造訪 此處享受尊榮服務
    如果回覆對您有幫助,請記得按下標示為解答」
    2011年5月4日 下午 04:08
    版主
  • 那我是否有方法能查詢到使用者的IP位址呢?

    目前在Enterprise Manager的處理序資訊中看到的都是MAC address。

    要再去對應IP address有點不便,是否能直接查詢使用者的IP address呢?

    2011年5月5日 上午 01:34
  • Query sys.dm_exec_connections for client ip address.
    2011年5月5日 上午 03:06
  • 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
    
    

    樓上提供的那個動態檢視不能在 SQL Server 2000 執行



    ☞ 這裡是「免費的討論區」付費支援服務請造訪 此處享受尊榮服務
    如果回覆對您有幫助,請記得按下標示為解答」
    • 已標示為解答 Wnchn 2011年5月6日 上午 03:34
    2011年5月5日 上午 03:44
    版主
  • 謝謝版上前輩的指導
    2011年5月6日 上午 03:35