2012-03-30 38 views
21

Tôi có trình kích hoạt để chèn/cập nhật/xóa. Đó là làm việc tốt. Ngoài ra, tôi cần địa chỉ IP của khách hàng từ nơi thay đổi được thực hiện. Điều đó tôi cần trong T-SQL, có nghĩa là, không phải trong bất kỳ biểu mẫu web nào nhưng trong SQL/T-SQL trong khi trình kích hoạt của tôi sẽ bị sa thải.Cách lấy địa chỉ IP của máy khách từ chính SQL Server 2008?

Ngoài ra tôi đi-ogled, và nhận rằng có được lưu trữ thủ tục trong cơ sở dữ liệu tổng thể có tên xp_cmdshell mà khi thực hiện với ipconfig chúng tôi có thể nhận được địa chỉ IP. Tôi nghĩ rằng điều này sẽ chỉ hoạt động khi bạn có quyền truy cập quản trị vào cơ sở dữ liệu. Lưu trữ của tôi là một lưu trữ được chia sẻ, vì vậy tôi không có đặc quyền như vậy. Có cách nào khác không?

Xin giúp

Cảm ơn trước

Xin lưu ý: Tôi không có quyền quản trị trên của tôi SQL Server 2008 cơ sở dữ liệu. Tôi cần một giải pháp như một người dùng được xác thực.

Một cập nhật:

tôi đã có những giải pháp, truy vấn sẽ làm việc cho kịch bản của tôi là

SELECT hostname, net_library, net_address 
FROM sys.sysprocesses 
WHERE spid = @@SPID 

Nó thực thi khi cần thiết nhưng chỉ có một vấn đề, net_address đó không phải là ở định dạng IP. dưới đây là kết quả của tôi:

hostname net_library  net_address 
IPC03  TCP/IP   AE8F925461DE 

Tôi háo hức muốn biết:

  1. là gì net_address đây? Địa chỉ MAC hay địa chỉ IP nào đó?

  2. Có cách nào để chuyển đổi net_address thành ip không?

Humble yêu cầu:

Trước khi trả lời/bình luận/downvoting, tôi sẽ yêu cầu bạn phải đi qua các câu hỏi, đầu tiên, triệt để. Tôi tìm thấy một số kẻ bình luận/downvoted mà không đi đúng câu hỏi. Không có vấn đề, mọi người đều phạm sai lầm. Nhưng không phải lúc nào cũng mắc lỗi. :)

+1

Bạn đề cập đến cơ sở dữ liệu của bạn được lưu trữ, nhưng ứng dụng hoạt động như thế nào? Trong hầu hết các ứng dụng ASP.NET, người dùng kết nối với một trang web và trang web sau đó kết nối với cơ sở dữ liệu. Vì vậy, máy chủ cơ sở dữ liệu không có ý tưởng người hoặc nơi người dùng cuối 'thực sự' là. Nếu bạn có thể cung cấp thêm một số chi tiết về ứng dụng của bạn và cách người dùng kết nối với cơ sở dữ liệu, ai đó có thể có đề xuất. – Pondlife

+0

Bạn có thể tìm thấy chi tiết về ** net_address ** từ http://msdn.microsoft.com/en-us/library/ms179881.aspx –

Trả lời

31

tôi tìm thấy một cái gì đó mà có thể làm việc cho bạn

CREATE FUNCTION [dbo].[GetCurrentIP]() 
RETURNS varchar(255) 
AS 
BEGIN 
    DECLARE @IP_Address varchar(255); 

    SELECT @IP_Address = client_net_address 
    FROM sys.dm_exec_connections 
    WHERE Session_id = @@SPID; 

    Return @IP_Address; 
END 

Từ How to get Client IP Address in SQL Server

Cũng có một cái nhìn tại bài viết này về Get client IP address

+1

tìm thấy giống nhau nhưng bạn đã thắng với 20 giây :) –

+0

+1 cho sự chân thành của bạn trên SO .... giữ nó trên –

+2

Hi, có vẻ như truy vấn là tốt nhưng tôi nhận được một thông báo lỗi - Người dùng không có quyền thực hiện hành động này. Kịch bản tương tự đã xuất hiện ở đây .. Tôi không có đặc quyền quản trị –

20

Bạn có thể thử this solution.Nó thậm chí còn hoạt động trên lưu trữ chia sẻ:

select CONNECTIONPROPERTY('client_net_address') AS client_net_address 
+0

Cảm ơn ... nhưng cuối cùng tôi chắc chắn sẽ cung cấp cho nó một ... –

+2

Liên kết chỉ ra rằng bạn có thể sử dụng 'CONNECTIONPROPERTY ('local_net_address') AS local_net_address' như một số biến CONNECTIONPROPERTY khác. – Trisped

+2

Đây là giải pháp tốt hơn vì nó không cần sự cho phép để đọc sys.dm_exec_connections –

5

Cuối cùng tham gia các bảng hai hệ thống:

SELECT hostname, 
     net_library, 
     net_address, 
     client_net_address 
FROM sys.sysprocesses AS S 
INNER JOIN sys.dm_exec_connections AS decc ON S.spid = decc.session_id 
WHERE spid = @@SPID 

Output:

hostname | net_library | net_address | client_net_address  
PIERRE | TCP/IP  | 0090F5E5DEFF| 10.38.168.5 
4

nó cần dòng chỉ đơn mã

SELECT CONVERT(char(15), CONNECTIONPROPERTY('client_net_address')) 
0

Tôi không thể nhận được số chính xác tôi Địa chỉ P, thay vào đó tôi nhận được một giá trị NULL vì giới hạn của các câu lệnh trên. Giới hạn là bạn chỉ nhận được địa chỉ IP nếu bạn được kết nối qua TCP/IP. Nếu bạn là người địa phương và sử dụng bộ nhớ chia sẻ thì các thuộc tính đó không tồn tại. Nếu bạn tắt bộ nhớ chia sẻ (hoặc bất kỳ giao thức nào ngoại trừ TCP/IP) thông qua Trình quản lý cấu hình máy chủ, bạn sẽ luôn nhận được địa chỉ IP cho bất kỳ kết nối nào.

Bạn đang mắc kẹt tốt nhất với

SELECT SERVERPROPERTY(N'MachineName'); 

... mà có thể hoạt động ở vị trí của địa chỉ IP số.

Các vấn đề liên quan