2012-05-13 13 views
23

Các tài liệu MSDN nói cho SUSER_SNAME chức năng:T-SQL: SUSER_SNAME và SUSER_NAME?

Trả về tên nhận dạng đăng nhập từ mã số an ninh của người dùng (SID).

More kết thúc, nó nói cho SUSER_NAME chức năng:

Trả về tên nhận dạng đăng nhập của người dùng.

Tuy nhiên, khi tôi thực hiện các câu lệnh SQL sau tôi nhận được cùng kết quả:

SELECT SUSER_NAME(); 
SELECT SUSER_SNAME(); 

Vì vậy, những gì khác biệt, và cái nào tôi sẽ sử dụng không? Có tình huống nào tôi nên sử dụng cái kia thay vì cái kia không?

lời khuyên Xin vui lòng,

Cảm ơn trước :)

Trả lời

26

Nếu bạn gọi hàm mà không có một lý lẽ họ sẽ đều trả về giá trị tương tự. Nhưng họ một vài tham số khác nhau:

  • SUSER_SNAME() lấy varbinary(85) SID của một tên đăng nhập như là đối số
  • SUSER_NAME() lấy integer principal_id của một tên đăng nhập

Bạn có thể xác minh điều này như:

select suser_name(principal_id) 
,  suser_name(sid) 
,  suser_sname(principal_id) 
,  suser_sname(sid) 
from sys.server_principals 
where name = suser_name() 

Chỉ cột đầu tiên và cột cuối cùng sẽ trả về giá trị không null.

+0

Tôi đã thực hiện câu lệnh bạn đã cung cấp và chỉ cột thứ ba là null, có vẻ như 'SUSER_NAME' chấp nhận cả' principal_id' và 'sid'. Bằng cách này tôi đang sử dụng SQL Server 2012 nếu có vấn đề. –

+1

@ MohammedA.Fadil: Lạ, tôi cũng đang sử dụng năm 2012 và cột hai và ba là 'null'. Có thể có một trường hợp góc trong đó 'cast (sid as int)' tương đương với 'principal_id', nhưng điều đó rất khó xảy ra – Andomar

+0

@MohammedA.Fadil: Bạn đã đăng nhập dưới dạng sa khi bạn thấy kết quả đó chưa? Tôi thấy principal_id = sid cho các hiệu trưởng máy chủ tích hợp. –

0

SUSER_NAME() sẽ trả về tên được liên kết với một sid tồn tại trong sys.server_principals. Sid phải tồn tại trong sys.server_principals.

SUSER_SNAME() có thể làm điều đó mà còn có thể trả lại sid của một tên đăng nhập nếu đăng nhập là thành viên của một nhóm hoạt động thư mục

Vì vậy, nếu bạn có [CONTOSO \ MyGroup] trong Active Directory và nhóm có một người dùng [CONTOSO \ MyUser]

Và bạn thêm nhóm đó vào SQL Server: TẠO ĐĂNG NHẬP [CONTOSO \ MyGroup] FROM WINDOWS;

CHỌN SUSER_ID ('CONTOSO \ myuser'), SUSER_SID ('CONTOSO \ myuser')

sẽ cung cấp cho bạn NULL, CONTOSO \ myuser vì CONTOSO \ myuser không có trong sys.server_principals nhưng là A/D