2012-11-09 18 views
6

Điều này nghe có vẻ ngu ngốc nhưng tôi thấy nó thực sự khó hiểu: trong MSDN định nghĩa là thực thể có thể yêu cầu tài nguyên SQL Server. Và về cơ bản có ba loại hiệu trưởng: các hiệu trưởng cấp Windows, các hiệu trưởng cấp SQL Server và các hiệu trưởng cấp cơ sở dữ liệu. Cho đến nay nó là tốt. Chỉ khi nó cho tôi một ấn tượng rằng định danh của một hiệu trưởng nên khác với nguyên tắc khác, bất kể nguyên tắc này là gì. (Nếu tất cả các hiệu trưởng của ba loại này có thể được sắp xếp trong một bảng, chúng sẽ có số nhận dạng duy nhất)Làm thế nào để hiểu được các nguyên tắc trong SQL Server?

phần khó hiểu xuất phát từ ba câu hỏi dưới đây:

1)

Select name,principal_id from sys.database_principals 

(Lưu ý: tôi chạy nó trên một cơ sở dữ liệu)

2)

Select name,principal_id from sys.server_principals 

Bây giờ tôi biết người đầu tiên trả về các nguyên tắc người dùng cơ sở dữ liệu trong khi người thứ hai trả về hiệu trưởng của người dùng máy chủ (sửa tôi nếu tôi sai). Nhưng tại sao một hàng từ truy vấn đầu tiên có thể có cùng một principal_id như một từ truy vấn thứ hai? Ví dụ, một hàng từ gốc cơ sở dữ liệu sẽ là:

Tên: INFORMATION_SCHEMA, principal_id: 3

trong khi một hàng từ các truy vấn thứ hai là

Tên: sysadmin, principal_id: 3

Hai yếu tố này là gì? Như tôi đã đề cập, tôi nghĩ rằng số nhận dạng của hai hiệu trưởng sẽ khác nhau, ngay cả khi một là người dùng DB và người kia là người dùng máy chủ (và từ tên tôi giả sử principal_id là số nhận dạng). Vâng, nếu principal_id không phải là duy nhất cho tất cả các hiệu trưởng, nhưng chỉ duy nhất ở phạm vi của mỗi truy vấn (principal_id từ truy vấn đầu tiên chỉ là số nhận dạng cho người dùng cơ sở dữ liệu, vì vậy nó có thể giống với từ người dùng máy chủ), sau đó tôi có một truy vấn thứ ba và không hiểu nó nghĩa là gì:

3)

SELECT 
    SDP.PRINCIPAL_ID AS [Principal ID], 
    SDP.NAME AS [Database UserName], 
    SDP.TYPE_DESC AS [Datebase UserType], 
    SSP.NAME AS [Server LoginName], 
    SSP.TYPE_DESC AS [Server LoginType] 
FROM sys.database_principals SDP 
INNER JOIN sys.server_principals SSP 
ON SDP.PRINCIPAL_ID = SSP.PRINCIPAL_ID 

Nếu hai principal_id chỉ duy nhất trong phạm vi của họ, những gì nó có nghĩa là để làm cho một bên tham gia vào cả hai principal_id? Một tham gia bên trong có nghĩa là cột này là cùng độc đáo, phải không?

Phải có điều gì đó rất sơ cấp mà tôi hiểu lầm. Cảm ơn bạn đã giúp đỡ về điều đó!

+0

Bạn lấy truy vấn thứ 3 từ đâu? –

+0

@Damien_The_Unbeliever nhiều bài viết có bài viết tương tự. Giống như liên kết này: http://www.sql-server-performance.com/2009/analyzing-sql-server-permissions/ – tete

+0

và bạn đã đọc một nhận xét trên bài viết đó - chỉ ra rằng việc tham gia vào principal_id là không chính xác, và SID đó nên được sử dụng thay thế? –

Trả lời

8

Không có thư từ nào giữa principal_id s trên sys.database_principalssys.server_principals. Ngày đầu tiên, nó chỉ được ghi nhận là duy nhất trong cơ sở dữ liệu. Thứ hai, chúng là duy nhất trên máy chủ. Và không có mối quan hệ được ghi lại giữa các cột này trong cùng một chế độ xem.

Trong thực tế, số thấp principal_id s có nhiều khả năng được chỉ định trong cả hai chế độ xem và các hiệu trưởng có liên quan đến chúng không liên quan.

Do đó, truy vấn hiển thị kết hợp giữa hai chế độ xem bằng cách sử dụng principal_id là sai.

+1

cảm ơn câu trả lời của bạn. Tôi có thêm một câu hỏi: nhận xét trong liên kết của tôi cho biết rằng mục đích của truy vấn là đối sánh thông tin đăng nhập máy chủ với người dùng cơ sở dữ liệu tương ứng của họ. Và nó thực sự là những gì tôi đang cố gắng làm. Tuy nhiên, nếu tôi chạy truy vấn đã sửa đổi (thay đổi kết nối bên trong trên sid), tôi không thể lấy thông tin đăng nhập của mình và với người dùng DB được ánh xạ. Hãy để tôi làm rõ những gì tôi muốn làm một lần nữa: nếu tôi chạy chọn SYSTEM_USER, tôi đã đăng nhập cửa sổ của tôi, và tôi selct CURRENT_USER, tôi đã nhận dbo. Tôi đang cố gắng tìm bản đồ giữa hai điều này. – tete

+0

Tuy nhiên, mặc dù tôi có đăng nhập của tôi trong truy vấn server_principal, không có ai có cùng một sid trong database_principal. Vì vậy, tôi bị mất dấu vết của tôi. Tôi đã làm gì sai sao? Ví dụ, tôi có quyền hiển thị tất cả database_principal không? Đăng nhập của tôi là dưới vai trò máy chủ sysadmin – tete

+0

@tete - nếu bạn là thành viên của 'sysadmin' thì tất cả các loại quy tắc lạ sẽ khởi động - bạn sẽ tự động' dbo' trong mọi cơ sở dữ liệu, mà không có bất kỳ mục nhập nào trong 'database_principals' , ví dụ. –

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