Câu trả lời:
Có nhiều mục vì bạn có thể được cấp cùng một quyền nhiều lần, từ các "người cấp" khác nhau. Nếu hiệu trưởng đó (tức là "người được cấp") đã được cấp quyền đó từ hai người cấp, thì bạn sẽ thấy ba mục cho cùng quyền đó trên màn hình này.
Đối với các mục "trùng lặp" mà bạn đang thấy, mục có cột "Nhà tài trợ" trống có thể được sử dụng để gán cùng một quyền từ một người cấp khác so với mục được liệt kê trong mục khác cho cùng quyền đó (trong trường hợp này là : dbo
). Tất nhiên, tôi không chắc tại sao lại có thêm mục nhập khi bạn được kết nối với tư cách là hiệu trưởng đã được cấp phép cho những gì sẽ là cùng một người cấp vì bạn chỉ có thể có một hàng cho mỗi người cấp. Ví dụ: nếu bạn thay đổi tùy chọn "With Grant" thành "dbo", thì nó sẽ chỉ cập nhật mục nhập cho "Grantor" = "dbo". Tôi đoán GUI không kiểm tra kết nối để lọc ra các hàng trống khi có hàng "Nhà tài trợ" không trống cho cùng hiệu trưởng với kết nối. Sau đó một lần nữa,đó là ô "Grantor" là một hiệu trưởng thả xuống cho phép chọn một thứ được sử dụng trong AS
mệnh đề của GRANT
câu lệnh, nhưng không phải vậy, nên có hàng trống có vẻ khó hiểu hơn thực tế.
Hãy thử làm như sau để thấy điều này trong hành động:
USE [tempdb];
CREATE USER [GrantPark] WITHOUT LOGIN;
CREATE USER [GrantWard] WITHOUT LOGIN;
CREATE TABLE dbo.MultiplePermissionsTest (Col1 INT);
SELECT dp.[permission_name], dp.state_desc, USER_NAME(dp.grantee_principal_id)
AS [Grantee], USER_NAME(dp.grantor_principal_id) AS [Grantor]
FROM sys.database_permissions dp
WHERE OBJECT_NAME(dp.major_id) = N'MultiplePermissionsTest';
GRANT SELECT ON dbo.MultiplePermissionsTest TO [GrantPark] WITH GRANT OPTION;
SELECT dp.[permission_name], dp.state_desc, USER_NAME(dp.grantee_principal_id)
AS [Grantee], USER_NAME(dp.grantor_principal_id) AS [Grantor]
FROM sys.database_permissions dp
WHERE OBJECT_NAME(dp.major_id) = N'MultiplePermissionsTest';
GRANT SELECT ON dbo.MultiplePermissionsTest TO [GrantWard];
SELECT dp.[permission_name], dp.state_desc, USER_NAME(dp.grantee_principal_id)
AS [Grantee], USER_NAME(dp.grantor_principal_id) AS [Grantor]
FROM sys.database_permissions dp
WHERE OBJECT_NAME(dp.major_id) = N'MultiplePermissionsTest';
GRANT SELECT ON dbo.MultiplePermissionsTest TO [GrantWard] AS [GrantPark];
SELECT dp.[permission_name], dp.state_desc, USER_NAME(dp.grantee_principal_id)
AS [Grantee], USER_NAME(dp.grantor_principal_id) AS [Grantor]
FROM sys.database_permissions dp
WHERE OBJECT_NAME(dp.major_id) = N'MultiplePermissionsTest';
Trả về:
permission_name state_desc Grantee Grantor
(no rows)
permission_name state_desc Grantee Grantor
SELECT GRANT_WITH_GRANT_OPTION GrantPark dbo
permission_name state_desc Grantee Grantor
SELECT GRANT_WITH_GRANT_OPTION GrantPark dbo
SELECT GRANT GrantWard dbo
permission_name state_desc Grantee Grantor
SELECT GRANT_WITH_GRANT_OPTION GrantPark dbo
SELECT GRANT GrantWard dbo
SELECT GRANT GrantWard GrantPark
Bây giờ, đi đến SSMS và mở rộng thư mục "Cơ sở dữ liệu hệ thống", sau đó chuyển đến "tempdb", sau đó đến "Bảng". Nhấp chuột phải vào "dbo.Mult MônPermissionsTest" và đi đến "Thuộc tính", sau đó đến "Quyền" và chọn "GrantWard". Cuộn xuống một chút và bạn sẽ thấy 3 hàng cho "Chọn", mỗi hàng có một giá trị khác nhau cho "Nhà tài trợ": (trống) dbo
, và GrantPark
.